快速排序 ← 三种基准值选择

本文介绍了快速排序算法,它是冒泡排序的改进版,通过选取枢轴元素将待排序序列分为两部分,递归地对左右子序列进行排序,从而提高效率。提供了三种不同的枢轴选取方式(首、尾、中位)的C++代码实现,并展示了输入样例的排序结果。
摘要由CSDN通过智能技术生成

【算法分析】
快速排序(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
*/

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值