快速排序算法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;
}
}
}