快速排序——一步一步算法篇

快速排序

快速排序是对冒泡排序的一种改进
基本思想:在待排序的数据中找出一个枢轴,这个枢轴可以在两侧,可以在中间。然后通过一趟排序将这组数据分成两部分,使一部分的数据要比枢轴大,另一部分数据要比枢轴小,但这两部分数据仍是无序的。再通过递归和循环排序,将这两部分数据重复上面过程,从而达到让整个序列有序。
假设待排序列为{a[1],a[1+1],a[1+2],…,a[r]},首先任意选取一个枢轴或支点作为排序的关键,然后通过一趟排序,将比这个数轴小的数都放在这个枢轴的左侧(左子序列),比这个枢轴大的数放在它的右侧(右子序列)。然后再在两个子序列中重复上列过程,完成排序,这个过程称为快速排序
这里写图片描述快速排序基本思想
这里写图片描述
具体做法:设置两个指针i,j,赋其初值为l,r,设中间的数枢轴*mid,从i开始向前搜索,搜索第一个到比枢轴大的数停止,然后从j开始向后搜索,搜索到第一个比枢轴小的数停止,然后将两个数交换,重复上列过程,利用递归*,完成排序。

示例一:

示例二:
这里写图片描述
图片来自 图片来自:http://blog.csdn.net/wolinxuebin/article/details/7456330

#include<iostream>   
#include<cstdio>
using namespace std;
int a[101];int n;
void ysort(int,int);
int main()
{
    int k,o;
    cin>>n;
    for(k=1;k<=n;k++)
      cin>>a[k];
    ysort(1,n);
     for(int o=1;o<=n;o++)
      cout<<a[o]<<" ";

}
void ysort (int l,int r)
{
    int i,j,mid,p;
    i=l;j=r;
    mid=a[(l+r)/2];  //将中间数作为枢轴 
    do
      {
        while(a[i]<mid) i++;   //在左半部分寻找比中间数大的数 
        while(a[j]>mid) j--;   //在右半部分寻找比中间数小的数 
        if(i<=j)  
        {
            p=a[i];a[i]=a[j];a[j]=p;  //找到与排序目标不同的数对,交换他们 
            i++;j--; //并将指针下移 
        }
      } while(i<j);    //这里是否有等号?(我也不知道,应该加上) 
    if(l<j) ysort(l,j);   //递归
    if(i<r) ysort(i,r);   //递归
}

下面的代码第一个数为枢轴
此代码转自:http://blog.sina.com.cn/s/blog_5c5bc9070100y4zv.html

#include<iostream>  
using namespace std;  
void quickSort(int a[],int,int);  
int main()  
{  
    int array[]={34,65,12,43,67,5,78,10,3,70},k;  
    int len=sizeof(array)/sizeof(int);  
    cout<<"The orginal arrayare:"<<endl;  
    for(k=0;k<len;k++)  
        cout<<array[k]<<",";  
    cout<<endl;  
    quickSort(array,0,len-1);  
    cout<<"The sorted arrayare:"<<endl;  
    for(k=0;k<len;k++)  
        cout<<array[k]<<",";  
    cout<<endl;  
    system("pause");  
    return 0;  
}  

void quickSort(int s[], int l, int r)  
{  
    if (l< r)  
    {        
        int i = l, j = r, x = s[l];  
        while (i < j)  
        {  
            while(i < j && s[j]>= x) // 从右向左找第一个小于x的数  
                j--;   
            if(i < j)  
                s[i++] = s[j];  
            while(i < j && s[i]< x) // 从左向右找第一个大于等于x的数  
                i++;   
            if(i < j)  
                s[j--] = s[i];  
        }  
        s[i] = x;  
        quickSort(s, l, i - 1); // 递归调用  
        quickSort(s, i + 1, r);  
    }  
}  

复杂性:
这里写图片描述

快速排序虽然在c++中存在函数,但这种思想仍然需要将其掌握。


一步一步算法篇

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值