每次 从待排序序列中选择出一个最大(或者最小)的记录添加到有序序列的后面即为选择排序。
选择排序主要有:简单选择排序、树形选择排序、堆排序。
1、简单选择排序
基本思路:重复进行n趟选择,第i趟通过n-i次记录的比较,在n-i+1个记录中选取最小(或最大)的记录与第i个记录进行交换。
void selectSort(int arr[],int n){ int outer,inner; int min; for(outer=1;outer<=n;outer++ ){ min = outer; for(inner=outer;inner<=n;inner++) if(arr[inner]<arr[min]) min = inner; if(min != outer){ arr[0] = arr[min]; arr[min] = arr[outer]; arr[outer] = arr[0]; } } }
2、堆排序
堆:(1) 堆是完全二叉树;
(2) 小根堆:每个结点的值小于等于左右孩子结点的值;大根堆:每个结点的值大于等于左右孩子结点的值。
堆排序:对于大根堆来说,堆顶记录即是整个序列的最大值。我们将待排序序列构造成一个堆,选出堆顶记录(最大值),然后把剩下的记录重新调整成堆,再选择出堆顶记录(次大值),依次下去,直到堆中只剩下一个记录。
void shiftHeap(int arr[],int k,int m){ int i = k; int j = i * 2; while(j <= m){ if(j<m && arr[j]<arr[j+1]) j++; if(arr[i]>arr[j]) break; else{ arr[0] = arr[i]; arr[i] = arr[j]; i = j; j = 2 * i; } } } void heapSort(int arr[],int n){ int index; for(index = n/2;index>=1;index--) shiftHeap(arr,index,n); for(index=1;index<n;index++){ arr[0] = arr[1]; arr[1] = arr[n-index+1]; arr[n-index+1] = arr[0]; shiftHeap(arr,1,n-index); } }
3、总结
简单选择排序:时间复杂度为o(n2),是不稳定排序。
堆排序:时间复杂度为o(nlog2n),是不稳定排序。
堆排序其实就是每次选择待排序序列中的最大值(或最小),它与简单选择排序的区别就是:简单选择排序是通过比较n-i+1个记录来选择最值,而堆排序是通过构造堆来选择最值。所以堆排序最重要的就是调整成堆的过程。
时间: 2024-10-10 01:19:42