该算法来源于[数据结构(C语言版)].严蔚敏_吴伟民.,这里根据自己需要换成了c#语言,有的不清楚,是在百度百科搜索后整理了一下,记录下来的,
数组从[0..n-1]进行排序的
测试数据:int[] array = { 49, 38, 65, 97, 76, 13, 27, 49 };
1.直接选择排序
/// <summary> ///选择排序:对排序表a[0].....R[n-1]进行选择排序 ///直接选择排序是不稳定的 ///O(n^2) /// </summary> /// <param name="R"></param> public void SelectSort(int[] array) { int i, k, j, temp; for (i = 0; i < array.Length - 1; i++) //*做n-1趟选取*/ { k = i; //*在i开始的n-i+1个记录中选关键码最小的记录*/ for (j = i + 1; j <= array.Length - 1; j++) if (array[j] < array[k]) k = j; //*k中存放关键码最小记录的下标*/ if (i != k) //*关键码最小的记录与第i个记录交换*/ { temp = array[k]; array[k] = array[i]; array[i] = temp; } } }
2.堆排序
/// <summary> /// 根据数组array[0..n-1]构建大根堆 /// array是待调整的堆数组,i是待调整的数组元素的位置,length是数组的长度 /// </summary> void HeapAdjust1(int[] array, int i, int length) { int child; int temp; for (temp = array[i]; 2 * i + 1 < length; i = child) { //子结点的位置=2*(父结点位置)+ 1 child = 2 * i + 1; // 得到子结点中较大的结点 if (child < length - 1 && array[child] < array[child + 1]) ++child; // 如果较大的子结点大于父结点那么把较大的子结点往上移动,替换它的父结点 if (temp < array[child]) { array[i] = array[child]; } else { // 否则退出循环 break; } // 最后把需要调整的元素值放到合适的位置 array[child] = temp; } } 测试数据:49, 38, 65, 97, 76, 13, 27, 49 初始大根堆: // 49 // 38 65 // 97 76 13 27 //49 /// <summary> /// 堆排序算法:array[0..n-1]是待调整的堆数组,length是数组的长度 /// 堆排序的时间,主要由建立初始堆和反复重建堆这两部分的时间开销构成,它们均是通过调用Heapify实现的。 /// 堆排序的最坏时间复杂度为O(nlogn)。堆序的平均性能较接近于最坏性能。 /// 由于建初始堆所需的比较次数较多,所以堆排序不适宜于记录数较少的文件。 /// 堆排序是就地排序,辅助空间为O(1), /// 它是不稳定的排序方法。 /// </summary> public void HeapSort(int[] array, int length) { // 调整序列的前半部分元素,调整完之后第一个元素是序列的最大的元素 for (int i = length / 2 - 1; i >= 0; --i) { HeapAdjust1(array, i, length); } // 从最后一个元素开始对序列进行调整,不断的缩小调整的范围直到第一个元素 for (int i = length - 1; i > 0; --i) { // 把第一个元素和当前的最后一个元素交换, // 保证当前的最后一个位置的元素都是在现在的这个序列之中最大的 int temp = array[0]; array[0] = array[i]; array[i] = temp; // 不断缩小调整heap的范围,每一次调整完毕保证第一个元素是当前序列的最大值 HeapAdjust1(array, 0, i); } }