该算法来源于[数据结构(C语言版)].严蔚敏_吴伟民.,这里根据自己需要换成了c#语言,有的不清楚,是在百度百科搜索后整理了一下,记录下来的,
数组从[0..n-1]进行排序的
测试数据:int[] array = { 49, 38, 65, 97, 76, 13, 27, 49 };
1.冒泡排序
/// <summary> /// 冒泡排序(没有判断是否完成排序),最简单的,最原始的 /// </summary> public void BubbleSort0(int[] array) { int r0; for(int i=0;i<array.Length;i++) for (int j = 1; j < array.Length; j++) { if (array[j - 1] > array[j]) { r0 = array[j-1]; array[j - 1] = array[j]; array[j] = r0; } } }
2.冒泡排序改进:
在排序过程中,执行完最后的排序后,虽然数据已全部排序完备,但程序无法判断是否完成排序,为了解决这一不足,可设置一个标志位flag,将其初始值设置为非0,表示被排序的表是一个无序的表,每一次排序开始前设置flag值为0,在进行数据交换时,修改flag为非0。在新一轮排序开始时,检查此标志,若此标志为0,表示上一次没有做过交换数据,则结束排序;否则进行排序;
/// <summary> /// 冒泡排序(结果逆序:大的在上面,小的在下面) /// </summary> public void BubbleSort1(int[] array) { bool isExchanged = false; int i, j, temp;
for (i = 0; i < array.Length - 1; i++) { isExchanged = false; for (j = array.Length - 1; j > i; j--) //j > i { if (array[j] > array[j - 1]) { temp = array[j]; array[j] = array[j - 1]; array[j - 1] = temp; isExchanged = true; } } if (!isExchanged)//一遍比较过后如果没有进行交换则退出循环 break; } }
/// <summary> /// 冒泡排序(结果顺序:小的在上面,大的在下面) /// </summary> public void BubbleSort2(int[] array) { bool isExchanged = false; int i, j, temp; for (i = 0; i < array.Length; i++) { isExchanged = false; for (j = 0; j < array.Length - i - 1; j++) //array.Length - i - 1 进行n-i-1趟 { if (array[j + 1] < array[j]) { temp = array[j + 1]; array[j + 1] = array[j]; array[j] = temp; isExchanged = true; } } if (!isExchanged)//一遍比较过后如果没有进行交换则退出循环 break; } }
2.快速排序
/// <summary> ///快速排序 ///算法介绍: /// 设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小的数都放到它前面, /// 所有比它大的数都放到它后面,这个过程称为一趟快速排序。 /// 值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。 /// 一趟快速排序的算法是: /// 1)设置两个变量i、j,排序开始的时候:i=0,j=N-1; /// 2)以第一个数组元素作为关键数据,赋值给key,即 key=A[0]; /// 3)从j开始向前搜索,即由后开始向前搜索(j -- ),找到第一个小于key的值A[j],A[i]与A[j]交换; /// 4)从i开始向后搜索,即由前开始向后搜索(i ++ ),找到第一个大于key的A[i],A[i]与A[j]交换; /// 5)重复第3、4、5步,直到 i=j; (3,4步是在程序中没找到时候j=j-1,i=i+1,直至找到为止。找到并交换的时候i, j指针位置不变。另外当i=j这过程一定正好是i+或j-完成的最后令循环结束。) /// /// </summary> public void QuickSort(int[] R, int low, int high) { //对R[low..high]快速排序 int pivotpos; //划分后的基准记录的位置 if (low < high) {//仅当区间长度大于1时才须排序 pivotpos = Partition(R, low, high); //对R[low..high]做划分 QuickSort(R, low, pivotpos - 1); //对左区间递归排序 QuickSort(R, pivotpos + 1, high); //对右区间递归排序 } } /// <summary> /// 对R[low..high]做划分,并返回基准记录的位置 /// </summary> /// <returns></returns> int Partition(int[] R, int i, int j) { int pivot = R[i]; //用区间的第1个记录作为基准 ' while (i < j) { //从区间两端交替向中间扫描,直至i=j为止 while (i < j && R[j] >= pivot) //pivot相当于在位置i上 j--; //从右向左扫描,查找第1个关键字小于pivot.key的记录R[j] if (i < j) //表示找到的R[j]的关键字<pivot.key R[i++] = R[j]; //相当于交换R[i]和R[j],交换后i指针加1 while (i < j && R[i] <= pivot) //pivot相当于在位置j上 i++; //从左向右扫描,查找第1个关键字大于pivot.key的记录R[i] if (i < j) //表示找到了R[i],使R[i].key>pivot.key R[j--] = R[i]; //相当于交换R[i]和R[j],交换后j指针减1
} R[i] = pivot; //基准记录已被最后定位 return i; }
3.快速排序,取中间值作为基准,这个是在网上瞅见的
/// <summary> /// 快速排序:取中间的元素作为比较基准,小于他的往左边移,大于他的往右边移 /// </summary> /// <param name="array">待排序数组</param> /// <param name="left">数组第一个元素索引Index</param> /// <param name="right">数组最后一个元素索引Index</param> public void QuickSort1(int[] array, int left, int right) { //左边索引小于右边,则还未排序完成 if (left < right) { //取中间的元素作为比较基准,小于他的往左边移,大于他的往右边移 int middle = array[(left + right) / 2]; int i = left - 1; int j = right + 1; while (true) { while (array[++i] < middle && i < right) ; while (array[--j] > middle && j > 0) ; if (i >= j) break; Swap(array, i, j); } QuickSort1(array, left, i - 1); QuickSort1(array, j + 1, right); } } /// <summary> /// 交换元素值 /// </summary> /// <param name="array">数组</param> /// <param name="i">当前左边索引</param> /// <param name="j">当前右边索引</param> private static void Swap(int[] array, int i, int j) { int temp = array[i]; array[i] = array[j]; array[j] = temp; }