快速排序

本文对比了快速排序和冒泡排序两种算法,并详细介绍了快速排序的实现原理及过程。通过对快速排序算法的深入剖析,揭示其相较于冒泡排序的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

快速排序是一种基于比较和交换的排序方法,在学习之前我们先来重温一下快速排序吧。



改进的冒泡排序Code:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 100000;
int num[maxn];

int main()
{
    int n;
    scanf("%d", &n);
    for(int i = 1; i <= n; i++)
        scanf("%d", &num[i]);
    bool flag = false;
    for(int i = 1; i < n; i++)
    {
        for(int j = 1; j <= n-i; j++)
        {
            if(num[j] > num[j+1])
            {
                flag = true;                    //改进的地方,如果有一趟排序发现
                                                //什么都没变,说明现在已经是有序的了,直接退出就可以
                swap(num[j], num[j+1]);
            }
        }
        if(flag == false)
            break;
    }
    for(int i = 1; i <= n; i++)
        cout << num[i] << " ";
    return 0;
}

那么快速排序比冒泡排序厉害在哪里呢???

先来了解一下快速排序的算法实现原理吧:

基本思想:通过一趟排序将待排记录分成两个部分,其中一部分记录的关键字均比另一部分小,然后分别对这两部分继续进行排序,直至达到整个序列有序。

算法实现流程:待排序的序列为{num[low] , num[low+1] , num[low+2] ,  ...  , num[high] }

1. 首先先任取一个关键字(通常取num[low])作为枢轴,然后对整个序列进行整理,让比枢轴关键字小的记录都在枢轴的前面,比枢轴大的都在枢轴的后面,其实现在枢轴位置上放置的关键字,就是正确序列该位置的关键字。

2. 分别对枢轴两边的关键字进行递归整理,如此,就能实现对整个序列的排序。

算法实现:

核心部分就是:找到了枢轴,怎么对序列进行整理,让枢轴线面的都比它小,后面的都比它大。来一起看看吧





快速排序Code:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 1000000;
int num[maxn];

int Partition(int low, int high)
{
    num[0] = num[low];              //先把最左边的这个元素搬到凳子上
    while(low != high)              //开始循环
    {
        for(high; high > low; high--)
        if(num[high] < num[0]){
            num[low] = num[high];
            break;
        }
        for(low; low < high; low++)
        if(num[low] > num[0]){
            num[high] = num[low];
            break;
        }
    }
    num[low] = num[0];
    return low;
}

void Q_Sort(int low, int high)
{
    if(low < high)
    {
       int mid = Partition(low, high);
       Q_Sort(low, mid-1);
       Q_Sort(mid+1, high);
    }
    else
        return ;
}

int main()
{
    int n;
    scanf("%d", &n);
    for(int i = 1; i <= n; i++)
        scanf("%d", &num[i]);
    Q_Sort(1, n);
    for(int i = 1; i <= n; i++)
        if(i == 1) cout << num[i];
        else       cout << " " << num[i];
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值