十大经典排序(3)快速排序
快速排序概念
快速排序 (Quik Sort)是从冒泡排序算法演变而来的,实际上就是在冒泡排序基础上的递归分治法 。快速排序在每一轮挑选一个基准元素,使得比其大的元素移动到一边,比其小的移动到另一边。 算法原理
具体步骤
1、取一个数组的arr[l+(r-l)/2] 作为基准元素。
2、数组分为两部分,左边的小于基准元素 ,右边的大于基准元素 。
3、左右两边各边递归,更新基准值。
代码 //升序 void quik_sort(vector&arr, int l, int r) { //判断边界,如果里面什么都没有就不用执行了 if (l >= r) return; //取分界点 int i = l - 1, j = r + 1; //取基准元素 int x = arr[(l+r)>>1]; while(i < j) { //左指针向右移动,只到arr[i] >= x (边界) do i++; while (arr[i] < x); //右指针向左移动,只到arr[j] <= x (边界) do j--; while (arr[j] > x); //交换arr[i],arr[j] if (i < j) swap(arr[i], arr[j]); } //左部分做partition quik_sort(arr, l, j); //右部分做partition quik_sort(arr, j + 1, r); } //降序------ void quik_sort(vector&arr, int l, int r) { //判断边界,如果里面什么都没有就不用执行了 if (l >= r) return; //取分界点 int i = l - 1, j = r + 1; //取基准元素 int x = arr[(l+r)>>1]; while(i < j) { //左指针向右移动,只到arr[i] <= x (边界) do i++; while (arr[i] > x); //右指针向左移动,只到arr[j] <= x(边界) do j--; while (arr[j] < x); //交换arr[i],arr[j] if (i < j) swap(arr[i], arr[j]); } //左部分做partition quik_sort(arr, l, j); //右部分做partition quik_sort(arr, j + 1, r); }快速排序特性
时间复杂度:O(N*logN)
空间复杂度:O(logN)
稳定性:不稳定