基本排序系列之简述快速排序,快速掌握快排
2014-06-12 00:23
134 查看
快速排序
快速排序的算法复杂度最大可达到O(n*n)但平均算法复杂度为o(n*logn),由于快排采用了分治法,挺好用的,而且排序效率相对其他几种排序算法效率更高。
快排采用的是一般取第一个数为基准小的放在左边,大的放在右边,然后再对左边的进行分治,再右边的,按此下去达到排序的目的。
下面简述快排的思想:
如:数组a[5] = {2,4,5,1,6}
以第一个数a[0]即2为基准,指针i,j 分别从两头开始扫描直到找到小于key的数,否则从左边开始扫描,定义一个关键子key用来保存基准数,如果找到则保存在a[0]此时又空出了一个位置此时从左边扫描,扫描到的放到右边的空位置。
此时key = 2
先从左边开始扫描:
第一次:2 2 4 5 1 6
第二次:2 1 4 5 1 6
从左边扫描:
第三次:2 1 4 5 4 6
第四次:2 1 4 5 4 6
得到:[1] 2 [5 4 6]
因为左边只有一个数,所以只对右边再次采取分治法:
此时以5 为基准数即key = 5;
得到:[4] 5 [6]
最后:[1] 2 [4] [5] [6]
代码实现:
全部代码:
快速排序的算法复杂度最大可达到O(n*n)但平均算法复杂度为o(n*logn),由于快排采用了分治法,挺好用的,而且排序效率相对其他几种排序算法效率更高。
快排采用的是一般取第一个数为基准小的放在左边,大的放在右边,然后再对左边的进行分治,再右边的,按此下去达到排序的目的。
下面简述快排的思想:
如:数组a[5] = {2,4,5,1,6}
以第一个数a[0]即2为基准,指针i,j 分别从两头开始扫描直到找到小于key的数,否则从左边开始扫描,定义一个关键子key用来保存基准数,如果找到则保存在a[0]此时又空出了一个位置此时从左边扫描,扫描到的放到右边的空位置。
此时key = 2
先从左边开始扫描:
第一次:2 2 4 5 1 6
第二次:2 1 4 5 1 6
从左边扫描:
第三次:2 1 4 5 4 6
第四次:2 1 4 5 4 6
得到:[1] 2 [5 4 6]
因为左边只有一个数,所以只对右边再次采取分治法:
此时以5 为基准数即key = 5;
得到:[4] 5 [6]
最后:[1] 2 [4] [5] [6]
代码实现:
void QKSort(int a[],int low,int high)//low表示数组的低位,high表示数组的高位 { if(low>=high) { return; } int i = low; int j = high; int key = a[low]; //利用循环分治 while(i != j){ for(;j != i;j--){ if(a[j] <= key ){ a[i] = a[j]; break; } } for(;i != j;i++){ if(a[i] > key){ a[j] = a[i]; break; } } } a[i]=key;//将原取出的key值放回分界处 QKSort(a,low,i-1);//递归调用 QKSort(a,j+1,high); }
全部代码:
#include<iostream> #include<windows.h> using namespace std; //快速排序以递归实现的代码 void QKSort(int a[],int low,int high) { if(low>=high) { return; } int i = low; int j = high; int key = a[low]; while(i != j){ for(;j != i;j--){ if(a[j] <= key ){ a[i] = a[j]; break; } } for(;i != j;i++){ if(a[i] > key){ a[j] = a[i]; break; } } } a[i]=key; QKSort(a,low,i-1); QKSort(a,j+1,high); } int main() { int a[]={2,4,5,1,6}; QKSort(a,0,4); for(int i=0;i<5;i++) { cout<<a[i]<<" "; } cout<<endl; system("PAUSE"); return 0; }
相关文章推荐
- 白话经典算法系列之六 快速排序 快速搞定
- 【排序系列】快速排序java实现
- 白话经典算法系列之六 快速排序 快速搞定
- 经典算法系列一-快速排序
- 白话经典算法系列之六 快速排序 快速搞定
- MPI并行编程系列二:快速排序
- 白话经典算法系列之六 快速排序 快速搞定
- 快速掌握PHP多维数组排序方法
- 数据结构排序系列详解之四 快速排序
- 算法导论系列文章之快速排序
- 内部排序系列 之 冒泡排序与快速排序
- 白话经典算法系列之六 快速排序 快速搞定
- 白话经典算法系列之六 快速排序 快速搞定
- 白话经典算法系列之六 快速排序 快速搞定
- 白话经典算法系列之六 快速排序 快速搞定
- 白话经典算法系列之六 快速排序 快速搞定
- 基础算法系列(四)——快速排序
- 白话经典算法系列之六 快速排序 快速搞定
- 白话经典算法系列之六 快速排序 快速搞定
- 白话经典算法系列之六 快速排序 快速搞定