您的位置:首页 > 其它

基本排序系列之简述快速排序,快速掌握快排

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]

代码实现:

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: