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

                                                                                               快速排序

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


    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值