您的位置:首页 > 其它

快速排序

2016-01-12 15:13 176 查看
#include <iostream>
using namespace std;
/*
算法思想
1.将数组首位元素作为划分基准t
2.   从后往前寻找小于 t的元素 交换之
3.   从前往后寻找大于等于 t的元素    交换之
4.填写基准元素
5.返回划分位置。
*/
int partition(int *data,int l,int r){
int t=data[l];
while(l<r){
while(l<r&&data[r]>=t)
--r;
data[l]=data[r];
while(l<r&&data[l]<t)
++l;
data[r]=data[l];
}
data[l]=t;
return l;
}

void quick_sort(int *data,int l,int r){
if(l<r){
int mid= partition(data,l,r);
quick_sort(data,l,mid-1);
quick_sort(data,mid+1,r);
}
}

int main(){
int a[10]={34,1,56,3,24,5,6,3,8,0};
quick_sort(a,0,9);
for(int i=0;i<10;++i)
cout<<a[i]<<" ";
return 0;
}

解法二:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

/*
基准选择:data[left] data[center] data[right] 的值进行比较
1. data[left]=min(data[right],data[left],data[mid])
2. data[right]=max(data[right],data[center],data[left])
3. data[center]=median(data[left],data[right],data[center])
4. 将data[center]放置在data[right-1]
*/
int median(vector<int> &data,int left,int right){
int center=(left+right)/2;
if(data[left]>data[center])
swap(data[left],data[center]);
if(data[left]>data[right])
swap(data[left],data[right]);
if(data[center]>data[right])
swap(data[center],data[right]);
swap(data[center],data[right-1]);
return data[right-1];
}

int partition(vector<int> &data,int left,int right){
int pivot=median(data,left,right);
int i=left,j=right-1;
while(1){
while(data[++i]<pivot){}//从data[left+1]
while(data[--j]>pivot){}//从data[right-2]
if(i<j)
swap(data[i],data[j]);
else
break;
}
swap(data[i],data[right-1]);
return i;
}
/*快速选择算法*/
void quick_select(vector<int> &data,int k,int left,int right){
if(left<right){
int mid=partition(data,left,right);
if(k<mid)
quick_select(data,k,left,mid-1);
else if(k>mid)
quick_select(data,k,mid+1,right);
else
return ;
}
}

/*快速排序算法*/
void quick_sort(vector<int> &data,int left,int right){
if(left<right){
int mid=partition(data,left,right);
quick_sort(data,left,mid-1);
quick_sort(data,mid+1,right);
}
}

int main(){
int d[]={1,2,3,2,2,2,5,4,2};
vector<int> data(d,d+9);
// quick_select(data,8,0,8);
//for(int i=0;i<9;++i)
//  cout<<data[i]<<" ";

quick_sort(data,0,8);
for(int i=0;i<9;++i)
cout<<data[i]<<" ";

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