算法简介:
快速排序(Quicksort)是对 冒泡排序的一种改进。
快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以 递归进行,以此达到整个数据变成有序 序列。
为什么说快速排序是冒泡排序的一种改进呢?
简单来说,冒泡排序和快速排序的思路都是小的往前移动,大的往后移动。但是,冒泡排序是一个个元素进行比较再移动。而快速排序是从整体到个体,采用分治的算法思想去处理,移动的是序列,较小的序列前移,较大的后移,所以说快速排序是冒泡排序的一种改进
代码实现
void quickSort(int arr[], int l, int r) { if(l >= r) { return; } int mid = partition(arr,l,r); quickSort(arr,l,mid-1); quickSort(arr,mid+1,r); return; } int partition(int arr[], int l, int r) { int v = arr[l]; //arr[l+1....j] < v; arr[j+1....i) >v int j = l; for(int i = l+1; i <= r; i++) { if(arr[i] < v) { swap(arr,j+1,i); j++; } } swap(arr,j,l); return j; } void swap(int arr[], int a, int b) { int t = arr[a]; arr[a] = arr[b]; arr[b] = t; return; }
算法核心在于partition函数对左右两个区间的移动,既选取一个标尺值(这里是v),使得当前序列满足条件arr[l+1.....j] < v ; arr[j+1.......l] >v ,注意定义边界,将l指向的元素作为标尺并预留,然后遍历数组进行交换时从l+1出开始