一. 快速排序基础思想
快速排序的基础思想, 在一组无序的队列中选取一个基准数作为参考,把小于基准数的元素放在左(右)边,把大于基准数的元素放在右(左)边。无序的队列分成了两个部分,一部分是小于基准数的,一部分是大于基准数的,再对这两个部分进行同样的操作,以此类推,直到无序队列变成有序的队列。
二. 快速排序核心逻辑
1.从[ 5,3,7,4,2 ]队列中选择一个基准数5,以升序进行排序。a表示左边开始的位置下标,位置表示[ a0,a1,a2,a3,a4 ],b表示右边的位置下标,位置表示为[ b0,b1,b2,b3,b4 ]
2. 在无序队列中选择第一个元素作为基准数,并把位置记为p1
3. 从b4开始检索,2比5小,记录位置索引b4
4.从a0开始检索,比5还大的是7,记录位置索引a2
5.交换b4与a2对应的元素,得到的队列为[ 5,3,2,4,7 ]
6.从记录位置索引b4继续开始检索,选择比5小的元素,b3为4小于5,记录位置索引b3
7.从记录位置索引a2继续开始检索,选择比5大的元素,a3为4不大于5,此时a3与记录位置b3同个位置,说明在该位置已经把队列分为两个部分,记为o1,得到的队列为[ 5,3,2,4,7 ]
8.把p1的元素与o1的元素交换,得到的队列为[ 4,3,2,5,7 ] ,包含两个部分,比5小的[ 4,3,2 ]与比5大的[ 7 ]
9.对其中的 [ 4,3,2 ]与[ 7 ]重新按照1到8步骤执行,最终得到的有序队列为[ 2 ,3,4,5,7]
三. 快速排序图示
四. 快速排序代码
int[] tempArrays = new[] { 5,3,7,4,2 }; //无序队列元素 QuickSort(0, tempArrays.Length - 1, tempArrays); //快速排序方法调用
/// <summary> /// 快速排序 /// </summary> /// <param name="startIndex">开始位置</param> /// <param name="endIndex">结束位置</param> /// <param name="arrays">元素队列</param> public static void QuickSort(int startIndex, int endIndex, int[] arrays) { if (startIndex >= endIndex) return; //查询终止条件 int temp = arrays[startIndex]; //取得基准数 int i = startIndex; //记录开始下标 int j = endIndex; //记录结束下标 while (i != j) { while (arrays[j] >=temp && i < j) //查询比基准数小或等于的数 { j--; //下标减小 } while (arrays[i] <= temp && i < j) //查询比基准数大或等于的数 { i++; //下标增大 } if (i < j) //交换它们的位置 { int numTemp = arrays[i]; arrays[i] = arrays[j]; arrays[j] = numTemp; } } arrays[startIndex] = arrays[i]; //说明下标已经处于同个位置,把下标指明的位置的元素跟基准数处于的位置元素交换 arrays[i] = temp; //基准数以把队列分为两个部分,左边比基准数小的,右边比基准数大的 QuickSort(startIndex, i - 1, arrays); //对左边的队列进行同样的操作 QuickSort(i + 1, endIndex, arrays); //对右边的队列进行同样的操作 }
五. 快速排序复杂度
1.在理想状况下,每一次都将待排序数组划分成等长两个部分,则需要logn次划分,时间复杂度为O(nlogn)
2.在最坏的情况下,即数组已经有序或大致有序的情况下,每次划分只能减少一个元素,时间复杂度为O(n^2)
3.总结,天下难事,必作于易 天下大事 必作于细。文章的总体介绍已经达到我目前的要求,也有不足之处,请指出,我会不间断的更新文章。