算法描述
快速排序(Quick Sort)属于冒泡排序的一种变形。快速排序是一种不稳定性的排序。
基本思想
通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另外一部分的关键字小,则可分别对这部分记录继续进行排序,直至整个序列有序为止。
实现步骤
- 最左边的元素作为参照数据;
- 小于参照数据的集合作为左边的子集合,大于参照数据的集合作为右边的子集合
- 分别对左右子集合进行快速排序;
- 直到所有的序列是有序为止。
算法实现
代码在xcode中验证,可以直接使用
//通过一趟排序,将记录分为两部分,左边部分小于a[begin], 右边部分大于a[begin] int Q_Sort(int a[], int begin, int end) { int index = a[begin]; int i = begin; int j = end; while(i < j) { while(i < j && a[j] >= index) j--; if(i < j) //前后指针是否相同 { a[i++] = a[j]; } while(i < j && a[i] <= index) i++; if(i < j) //前后指针是否相同 { a[j--] = a[i]; } } a[i] = index; return i; } //通过Q_Sort得到中间的index,然后分别排序左边部分和右边部分,直到begin=end void QuickSort(int a[],int begin,int end) { if(begin < end) { int index = Q_Sort(a, begin, end); QuickSort(a, begin, index-1); QuickSort(a, index+1, end); } }
性能分析
平均时间复杂度为o(n*lgn),空间复杂度为o(1)
如果是有序序列,则快速排序会蜕变成冒泡排序,其时间复杂度为o(n^2)
如果是随机序列,则时间复杂度为o(n*lgn)