当前位置:首页 > 算法 > 正文内容

【排序】----选择排序

亿万年的星光5年前 (2021-01-28)算法3323
1.基本思想

每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在待排序的数列最前,直到全部待排序的数据排完。

2.过程

首先初始化最小元素索引值为首元素。依次遍历待排序数列,遇到小于该最小索引位置处的元素则刷新最小索引为该较小元素的位置。

直至遇到尾元素,结束一次遍历,并将最小索引处元素与首元素交换。

·初始化最小索引值为第二个待排序数列元素位置,同样的操作,可得到数列第二个元素即为次小元素;以此类推。


着重在于“



动图演示:


值得收藏的十大经典排序算法



#include<iostream>
using namespace std;
int main()
{
    int arr[]={12,45,13,88,79,11,52,66}; //定义数组
    int len =sizeof(arr) / sizeof(arr[0]); //测量数组长度
    for(int i=0;i<len;i++) // i控制当前序列最小值存放的位置,
    {
        int index=i; //首先记录下当前最小位置,假设index位置处元素是最小值
        for(int j=i+1;j<len;j++) //从
        {
           if (arr[j]<arr[index]) //每次找到数组中最小的一个值,
               index=j;   //找到了,把下标赋值给index
       }
       if(index!=i) //如果index和i不相同
       {
           int temp = arr[i];
           arr[i] =arr[index];
           arr[index]=temp; //交换arr[i]和a[index],将当前最小值放到arr[i]位置。
       }
       
       /*
       for(int i=0;i<len;i++)
       {
           cout<<arr[i]<<" ";
       }
       cout<<endl;
       */
    }
    return 0;
}

3.问题及改进

上面的算法思想是一次确定一个有序去的值(最小值),改进的方法可以一次确定两个值(一个最小值和一个最大值),这样可以提高效率。(部分代码)

#include<iostream>
using namespace std;
int main() {
   int arr[]= {12,45,13,88,79,11,52,66}; //定义数组
   int len =sizeof(arr) / sizeof(arr[0]); //测量数组长度
   int left = 0;
   int right = len - 1;
   while (left < right) {
       int max = left;//记录无序区最大元素下标
       int min = left;//记录无序区最小元素下标
       int j = 0;
       for (j = left + 1; j <= right; j++) {
          //找最大元素下标
           if (arr[j] < arr[min]) {
               min = j;
           }
          //找最小元素下标
           if (arr[j]>arr[max]) {
               max = j;
           }
       }
      //最小值如果是第一个则没有必要交换
       if (min != left) {
           int tmp = arr[left];
           arr[left] = arr[min];
           arr[min] = tmp;
       }
      //这里很重要,如果最大元素下标是left,前面已经和最小元素交换了,此时最大元素下标应该是min
       if (max == left) {
           max = min;
       }
      //最大值如果是最后一个则没必要交换
       if (max != right) {
           int tmp = arr[right];
           arr[right] = arr[max];
           arr[max] = tmp;
       }
       left++;
       right--;
   }
   return 0;
}


    扫描二维码推送至手机访问。

    版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

    分享给朋友:

    相关文章

    【算法】最短路径算法——Floyed-Warshell算法

    【算法】最短路径算法——Floyed-Warshell算法

    如下图所示,我们把边带有权值的图称为带权图。边的权值可以理解为两点之间的距离。一张图中任意两点间会有不同的路径相怜。最短路径就是指连接两点的这些路径中最短的一条。【注意】边的权值可以为负。当出现负边权...

    【二分】----基础用法

    【二分】----基础用法

    0.二分法简介二分法是一种查找算法要求:数据必须是有序序列核心思想:掐头去尾取中间1. 引入对于一个有序数组,如{1,3,6,8,23,56,78,99},如果我们要查找其中的一个数78的下标位置,按...

    【算法】最大子段和

    【算法】最大子段和

    【题目描述】给出一个长度位n的序列a,选出其中连续且非空的一段使得这段和最大【输入描述】第一行是一个整数,表示序列的长度n。第二行有n个整数,第i个整数表示序列的第i个数字ai【输出描述】输出一行一个...

    【算法】滑动窗口1—窗口大小固定

    【算法】滑动窗口1—窗口大小固定

    一、定义滑动窗口算法(Sliding Window Algorithm)是一种用于解决数组或字符串中子数组或子串问题的优化技术。它通过维护一个窗口(通常是数组或字符串的一个连续子区间),在遍历过程中动...

    【算法】二叉树(1):二叉树及其编号

    【算法】二叉树(1):二叉树及其编号

    0.前言        二叉树(Binary Tree)的递归定义如下:二叉树要么为空,要么由根结点(root)、左子树(left...

    【贪心】区间调度

    【贪心】区间调度

    【题目描述】有n项工作,每项工作分别在si时间开始,在ti时间结束。对于每项工作,你都可以选择参与与否。如果选择了参与,那么自始至终都必须全程参与。此外,参与工作的时间段不能重叠(即使是开始与结束的瞬...