快速排序算法c++实现

快速排序算法c++实现

算法思想:首先任意选取一个数据作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。
具体做法是:选取中间的数据作为基准值(平均来说效率更高),并与第一个数据进行交换。然后从左边找比基准值大的数,从右边找比基准值小的数。满足一定条件进行交换。使大数移到右边,小数移到左边。直到小数标记移到大数左边截止。将基准值与小数交换。这样以基准值分成两段数据。再进行排序。
理解要点:自己举例尝试。

#include "stdafx.h"
#include<iostream>
#include<ctime>
using namespace std;
typedef int T;

void sort(T a[],int n){
    if(n<=1) return;
    swap(*a,a[n>>1]);
    T* L=a+1;
    T* R=a+n-1;
    T  v=*a;
    while(L<R){
        while(*L<v&&L<R) L++;
        while(*R>=v&&R>a) R--;
        if(L<R) swap(*L,*R);   //地址指向的内容交换了 
    }
    if(v>*R)swap(*a,*R);
    sort(a,R-a);
    sort(R+1,n-(R-a)-1);
}


int _tmain(int argc, _TCHAR* argv[])
{
    const int N=3930/*10240*/;
    int a[N];
    for(int i=0;i<N;i++)
        a[i]=N-i;
    time_t t1=time(NULL);
    sort(a,N);
    time_t t2=time(NULL);
    cout<<"t2-t1="<<t2-t1<<endl;
    for(int i=0;i<10;i++)
        cout<<a[i]<<' ';
    cout<<endl;
    return 0;
}

实验结果:
t2-t1=0
1 2 3 4 5 6 7 8 9 10
请按任意键继续…
或者:

void swap(int *a,int *b)
{
    int temp=*a;
    *a=*b;
    *b=temp;

}

int partition(int a[],int low ,int high)
{
    int Key=a[low];
    while(low<high)
    {
        while(low<high && a[high]>=Key) --high;
        swap(&a[low],&a[high]);

        while(low<high && a[low]<=Key) ++low;
        swap(&a[low],&a[high]);
    }

    return low;


}

void quicksort(int a[],int low,int high)
{
    if (low<high)
    {
        int nkey=partition(a,low,high);
        quicksort(a,low,nkey-1);
        quicksort(a,nkey+1,high);

    }
}

程序中用到两个指针,分别指向数组的头尾。其实很多情况都会用到这种方法。
扩展一:
有一个整数数组,实现一个函数调整数组中的数字,使偶数放在数组后半部分,奇数放在数组前半部分。

void reorder(int *pdata,unsigned int length)
{
if(pdata==NULL&&length==0)
    return;
    int *pbegin=pdata;
    int *pend=pdata+length-1;
    while(pbegin<pend)
    {
        while(pbegin<pend&&(pbegin&0x01)!=0)
            pbegin++;
        while(pend>pbegin&&(pend&0x01)==0)
            pend--;
        if(pend<pbegin)
        {
        int temp = *pgegin;
        *pbegin = *pend;
        *pend = temp;

        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值