标签:
下面代码包含两种风格不一样的写法:
public class QuickSort { ///<summary> /// 分割函数 ///</summary> ///<param name="list">待排序的数组</param> ///<param name="left">数组的左下标</param> ///<param name="right"></param> ///<returns></returns> public static int Division(List<int> list, int left, int right) { //首先挑选一个基准元素 int baseNum = list[left]; while (left < right) { while (left < right && list[right] >= baseNum) { right = right - 1; } list[left] = list[right]; while (left < right && list[left] <= baseNum) { left = left + 1; } list[right] = list[left]; } //最后就是把baseNum放到该left的位置 list[left] = baseNum; //最终,我们发现left位置的左侧数值部分比left小,left位置右侧数值比left大 //至此,我们完成了第一篇排序 return left; } public static void QuickSortCore(List<int> list, int left, int right) { if (left < right) { int i = Division(list, left, right); QuickSortCore(list, left, i - 1); QuickSortCore(list, i + 1, right); } } private static int SortUnit(int[] array, int low, int high) { int key = array[low]; while (low < high) { /*从后向前搜索比key小的值*/ while (array[high] >= key && high > low) --high; /*比key小的放左边*/ array[low] = array[high]; /*从前向后搜索比key大的值,比key大的放右边*/ while (array[low] <= key && high > low) ++low; /*比key大的放右边*/ array[high] = array[low]; } /*左边都比key小,右边都比key大。//将key放在游标当前位置。//此时low等于high */ array[low] = key; //foreach (int i in array) //{ // Console.Write("{0}\t", i); //} return high; } public static void Sort(int[] array, int low, int high) { if (low >= high) return; /*完成一次单元排序*/ int index = SortUnit(array, low, high); /*对左边单元进行排序*/ Sort(array, low, index - 1); /*对右边单元进行排序*/ Sort(array, index + 1, high); } }
快速排序最好的时间复杂度为O(nlogn),最坏的时间复杂度为O(n²),平均复杂度为O(nlogn)。
标签:
原文地址:http://www.cnblogs.com/laixiancai/p/4639063.html