快速排序理解
快速排序的思路是:把序列分成左、右两部分,使得左边所有的数比右边所有的数小;递归这个过程,直到不能再分为止。
直接在原序列上进行划分:
- 尾部t是基准数,i指向比t小的左部分,j指向比t大的右部分
- 若data[j]大于等于data[t],j++;
3. 若data[j]<data[t],交换,然后i++,j++;
4. 重复上述步骤
5. 最后交换data[i]和data[t],得到结果。i指向基准数的当前位置
随机给n个数,进行快速排序
#include<iostream>
const int N=10005;
int data[N];
#define swap(a,b){int t=a;a=b;b=t;}
using namespace std;
int partition(int left,int right){//划分成左右两部分,以i指向的数为界
int i = left;
int t=data[right]; //把尾部的数看成基准数
for(int j=left;j<right;j++){
if(data[j]<t){
swap(data[j],data[i]);
i++;
}
}
swap(data[i],data[right]);
return i; //返回基准数的位置
}
void qsort(int left,int right)
{
if(left<right){
int m=partition(left,right); //划分
qsort(left,m-1); //i左边继续递归划分
qsort(m+1,right); //i右边继续递归划分
}
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>data[i];
}
qsort(1,n);
for(int i=1;i<=n;i++)
{
cout<<data[i]<<" ";
}
return 0;
}
快速排序模板
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int n,q[N];
void quick(int q[],int l,int r)
{
if(l>=r) return;
//确定分界点,随机取
int x=q[l],i=l-1,j=r+1;//i,j指向左右两侧,偏移量扩大1
while(i<j)
{
do i++;while(q[i]<x);
do j--;while(q[j]>x);
if(i<j) swap(q[i],q[j]);
}
quick(q,l,j);
quick(q,j+1,r);
}
int main()
{
cin>>n;
for(int i=0;i<n;i++) cin>>q[i];
quick(q,0,n-1);
for(int i=0;i<n;i++) cout<<q[i]<<" ";
return 0;
}