1.直接选择排序

直接选择排序和直接插入排序类似,都将数据分为有序区和无序区,所不同的是直接插入排序是将无序区的第一个元素直接插入到有序区以形成一个更大的有序区,而直接选择排序是从无序区选一个最小的元素直接放到有序区的最后。

设数组为a[0…n-1]。

1. 初始时,数组全为无序区为a[0..n-1]。令i=0

2. 在无序区a[i…n-1]中选取一个最小的元素,将其与a[i]交换。交换之后a[0…i]就形成了一个有序区。

3. i++并重复第二步直到i==n-1。排序完成

这里直接给出一种比较优化的直接选择排序,每次遍历选出最大值和最小值

voidSelectSort(int*a,size_tn)//选择排序优化版{assert(a);for(intleft=0,right=n-1;left<right;++left,--right){intmin=left;intmax=right;for(inti=left;i<=right;++i){if(a[i]<a[min])min=i;elseif(a[i]>a[max])max=i;}if(min!=left){std::swap(a[min],a[left]);if(max==left){max=min;}}if(max!=right){std::swap(a[max],a[right]);}}}

2.堆排序

将待排序的数组建立一个大堆,每次将堆顶的元素取出放在数组的最后一个位置上,再对数组的长度减1,然后对堆进行调整,使之仍然是一个大堆,直到堆的长度为1,将此元素放在数组的起始位置,排序完成。

voidAdjustDown(int*a,size_tsize,size_troot){assert(a);intchild=root*2+1;while(child<size){if(child+1<size&&a[child+1]>a[child]){++child;}if(a[child]>a[root]){std::swap(a[child],a[root]);root=child;child=root*2+1;}else{break;}}}voidHeapSort(int*a,size_tn){assert(a);for(inti=(n-2)/2;i>=0;--i){AdjustDown(a,n,i);//建(大)堆}for(inti=n-1;i>0;--i)//这样写比较好{std::swap(a[0],a[i]);AdjustDown(a,i-1,0);}}