【算法分析】
快速排序(Quick Sort)是由冒泡排序改进而得的。在冒泡排序过程中,只对相邻的两个记录进行比较,因此每次交换两个相邻记录时只能消除一个逆序排列。如果能通过两个(不相邻)记录的一次交换,消除多个逆序排列,则会大大加快排序的速度。快速排序方法中的一次交换可能消除多个逆序排列。
快速排序的算法步骤:在待排序的n个记录中任取一个记录(通常取第一个记录)作为枢轴(或支点),设其关键字为pivotkey。经过一趟排序后,把所有关键字小于pivotkey的记录交换到前面,把所有关键字大于pivotkey的记录交换到后面,结果将待排序记录分成两个子表,最后将枢轴放置在分界处的位置。然后,分别对左、右子表重复上述过程,直至每一子表只有一个记录时,排序完成。
【算法代码】
代码一:选序列第一个数作为基准值
#include <bits/stdc++.h>
using namespace std;
const int maxn=101;
int a[maxn];
int n;
void quickSort(int left,int right) {
int i,j,tmp,base;
i=left;
j=right;
if(left<=right) {
base=a[left];
while(i!=j) {
while(a[j]>=base&&i<j) j--;
while(a[i]<=base&&i<j) i++;
if(i<j) {
tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
}
a[left]=a[i];
a[i]=base;
quickSort(left,i-1);
quickSort(i+1,right);
}
}
int main() {
int n;
cin>>n;
for(int i=1; i<=n; i++)
cin>>a[i];
quickSort(1,n);
for(int i=1; i<=n; i++)
cout<<a[i]<<" ";
return 0;
}
/*
in:
8
49 38 65 97 76 13 27 49
out:
13 27 38 49 49 65 76 97
*/
代码二:选序列最后一个数作为基准值
#include <bits/stdc++.h>
using namespace std;
const int maxn=101;
int a[maxn];
int n;
void quicksort(int left,int right) {
int i,j,tmp,base;
i=left;
j=right;
if(left<=right) {
base=a[right];
while(i!=j) {
while(a[i]<=base&&i<j) i++;
while(a[j]>=base&&i<j) j--;
if(i<j) {
tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
}
a[right]=a[j];
a[j]=base;
quicksort(left,i-1);
quicksort(i+1,right);
}
}
int main() {
int n;
cin>>n;
for(int i=1; i<=n; i++)
cin>>a[i];
quickSort(1,n);
for(int i=1; i<=n; i++)
cout<<a[i]<<" ";
return 0;
}
/*
in:
8
49 38 65 97 76 13 27 49
out:
13 27 38 49 49 65 76 97
*/
代码三:选序列中间位置的数作为基准值
#include <bits/stdc++.h>
using namespace std;
const int maxn=101;
int a[maxn];
int n;
void quicksort(int left,int right){
int i=left,j=right;
int mid=(left+right)/2;
int tmp;
while(a[i]<a[mid]) i++;
while(a[j]>a[mid]) j--;
if(i<=j) {
tmp=a[i];
a[i]=a[j];
a[j]=tmp;
i++;
j--;
}
if(left<j) quicksort(left,j);
if(right>i) quicksort(i,right);
}
int main() {
int n;
cin>>n;
for(int i=1; i<=n; i++)
cin>>a[i];
quickSort(1,n);
for(int i=1; i<=n; i++)
cout<<a[i]<<" ";
return 0;
}
/*
in:
8
49 38 65 97 76 13 27 49
out:
13 27 38 49 49 65 76 97
*/