快速排序
快速排序的算法复杂度最大可达到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;
}