选择排序详解
选择排序
基本思想:每⼀次从待排序的数据元素中选出最⼩(或最⼤)的⼀个元素,存放在序列的起始位置或终止位置,直到全部待排序的数据元素排完。
直接选择排序
- 在元素集合
array[i]--array[n-1]中选择关键码最大(小)的数据元素- 若它不是这组元素中的最后⼀个(第⼀个)元素,则将它与这组元素中的最后⼀个(第⼀个)元素交换
- 在剩余的
array[i]--array[n-2](array[i+1]--array[n-1])集合中重复上述步骤,直到集合剩余1个元素
提醒:当然我们也可以同时找最大的和最小的,加快速度。(本讲解代码便是同时找当前未排序序列中最大的和最小的)
代码如下:
void my_swap(int* a, int* b)
{int temp = *a;*a = *b;*b = temp;
}
void SelectSort(int arr[], int n)
{int begin = 0, end = n - 1;int mini = 0, maxi = 0;while (end > begin){//每次进入循环后要重新开始搞起mini = maxi = begin;for (int i = begin + 1; i <= end; i++){if (arr[i] < arr[mini]){mini = i;}if (arr[i] > arr[maxi]){maxi = i;}}//下面的两次交换mini与begin的交换可能会影响end与maxi的交换if (maxi == begin){maxi=mini;}my_swap(&(arr[begin]), &(arr[mini]));my_swap(&(arr[end]), &(arr[maxi]));begin++;end--;}
}
直接选择排序算法详解
第一部分:
mini = maxi = begin;for (int i = begin + 1; i <= end; i++){if (arr[i] < arr[mini]){mini = i;}if (arr[i] > arr[maxi]){maxi = i;}}
先随机将最大值下标
maxi和最小值下标mini赋值给未排序部分第一个元素下标left,并分别在循环中,按照条件arr[i] < arr[mini]和arr[i] > arr[maxi]更新mini和maxi从而找到这个未排序序列里面的最大值和最小值下标。
第二部分:
if (maxi == begin){maxi=mini;}my_swap(&(arr[begin]), &(arr[mini]));my_swap(&(arr[end]), &(arr[maxi]));
找到
maxi和mini则将这个未排序的begin和end分别于mini和maxi位置元素互换位置。但是存在特殊情况。
为了解决这个问题,我们要添加一个条件当maxi == begin,将mini的值赋值给maxi。
第三部分:
begin++;
end--;
将这个序列的第一个和最后一个数组从待排序的序列中去除,并设置循环条件为
end>begin。
时间复杂度和空间复杂度
时间复杂度:O(n2)
空间复杂度:O(1)
最后补充说明:堆排序也是选择排序的一种,如果想要了解堆相关知识和堆排序可以点击–>堆的基础概念和堆排序



