acwing快速排序法
基本策略:
- 设法把待排序序列按某种标准分为大小两组。例如选择第一条记录R0作为区分标准,将所有大于R0的记录移到R0的右边,所有小于R0的记录移到R0的左边;
- 递归地分别对两组记录采用同样方式排序,直至划分到每个子部分只包含一个 记录,整个序列的排序完成;
具体实现:
- 一遍快速排序:设指针i 和j, 初值分别是序列第一个和最后记录的位置
取出第一条记录作为基准值, 设其排序码为K - 从j 所指位置起向前搜索, 找到第一个排序码小于K 的记录并将其存入i所指的空位;然后,从i 所指位置起向后搜索, 找到第一个排序码大于K 的记录并将其存入j所指的空位
- 重复地交替进行上述两个动作直到i 不小于j 为止
快排具体步骤实现:
输出每趟排序的结果
#include <stdio.h>
void print(int a[] ,int n)
{//输出数组元素,数字之间以一个空格为界,输出结束后换一行
for(int i=0;i<n;i++){
printf("%d ",a[i]);
}
printf("\n");
}
void qSort(int a[] ,int left, int right)
{
int l=left,r=right;
int i,j,temp;
if(l>=r) return;
i=l;
j=r;
temp=a[i];
while(i!=j)
{
while(j>i&&temp<=a[j]) j--;
if(i<j) a[i++]=a[j];
while(j>i&&temp>=a[i]) i++;
if(i<j) a[j--]=a[i];
}
a[i]=temp;
print(a,r+1);
qSort(a,l, i-1);
qSort(a,i+1,r);
}
int main(void)
{
int num ;
scanf("%d",&num);
int data[num];
for(int i=0;i<num;i++)
scanf("%d",&data[i]);
qSort(data ,0,num-1);
print(data,num);
}
acwing快速排序解法:
#include<iostream>
using namespace std;
const int N =1e6+10;
int n;
int q[N];
void quick_sort(int q[],int l,int r){
if(l >= r) return;
int i=l-1,j=r+1,x = q[l + r >> 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_sort(q,l,j);
quick_sort(q,j+1,r);
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++) {
scanf("%d",&q[i]);
}
quick_sort(q,0,n-1);
for (int i = 0; i < n; i ++ ) printf("%d ", q[i]);
return 0;
}