算法 快速排序
Posted luytest
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法 快速排序相关的知识,希望对你有一定的参考价值。
/// <summary> /// 快速排序,随机(第一个)值,通过比较令左边都是小于它的,右边都是大于它的 /// 以它为分割点,再递归对左右两边的无序数组进行相同操作,直到数组不可再分 /// 其实就是每次确认取出的值在整个数组中应当处于的位置,其他部分只跟它做大小比较 /// </summary> /// <param name="array">要排序的数组</param> /// <param name="left">数组起始下标</param> /// <param name="right">数组最大下标</param> public static void kuaisu(int[] array, int left, int right) { if (left < right) { //拿到mid说明已经找到一个位置 int mid = kuaisu_partion(array, left, right); //以mid为分割,对左右侧进行同样的操作 kuaisu(array, left, mid - 1); kuaisu(array, mid + 1, right); } } /// <summary> /// </summary> /// <param name="array">要排序的数组</param> /// <param name="left">数组起始下标</param> /// <param name="right">数组最大下标</param> public static int kuaisu_partion(int[] array, int left, int right) { int temp = array[left]; while (left < right) { //从右往左开始比较,数组的值大于等于temp且没找到边界时,继续找 while (array[right] >= temp && left < right) { right--;//往左走一位 } //找到比temp小的值后,将找到的值赋给left位置(空位) array[left] = array[right]; //从左往右开始比较,数组的值小于等于temp且没找到边界时,继续找 while (array[left] <= temp && left < right) { left++;//往右走一位 } //找到比temp大的值后,将找到的值赋给right位置(空位) array[right] = array[left]; } //此时left = right,确定了取出的temp的真正位置 array[left] = temp; Console.WriteLine("找到真正位置后temp归位:" + string.Join(\',\', array)); return left; } }
这个比较复杂,总结一下就是,
1.取出数组的第一个值,腾出位置;
2.先从右往左比,把比它小的放到左边的空位,同时比它小 的那个值的位置腾出成为空位;
3.再从左(排除步骤1的第一个值,因为肯定比取出的值小,所以不需要比较)往右比较,找到比它大的放到步骤2腾出的空位上;
4.不停的进行2,3步,直到左边的值都小于步骤1取出的值,右边的值都大于取出的值;
5.以步骤1取出的值的位置为分割点,左右都递归执行1~4步。
时间复杂度是 O(nlogn)
以上是关于算法 快速排序的主要内容,如果未能解决你的问题,请参考以下文章