交换排序之“快速排序”(C++实现)

快速排序(quick sort)是冒泡排序改进而来的,基本思想是在待排序的n个元素中,取第一个元素作为基准,将该元素放在适当的位置,将这个数据序列分为两部分,到这里称为一趟排序。此时基准数左边的数都比它小,基准数右边的数都比大。接下来便用同样的方法分别对左右两边的数据进行排序,直到序列中没有元素或只有一个元素。

快速排序每趟仅将一个元素归位。

接下来看一趟划分的代码,原理就是设置两个指示器i和j分别指向序列的第一个和最后一个元素。先是j从右往左扫描,当扫描到比基数小的元素就将该元素赋值到i指向的元素。然后便拍到i从左往右扫,当扫描到比基数大的元素就将该元素赋值给j指向的元素。如此循环直到i和j相遇,便将基数赋值给两个指针同时指向的这个元素。此时便是一趟排序完成。

一趟划分

int partition(int R[], int s, int t)//一趟划分
{
    int i = s, j = t;
    int tmp = R[i];//以第一个数为基准
    while (i<j)//两端交替向中间扫描,直到i=j为止
    {
        while (j>i&&R[j]>=tmp)//从右向左扫描
        {
            j--;
        }
        R[i] = R[j];//右边扫描结束

        while (i<j&&R[i]<=tmp)
        {
            i++;
        }
        R[j] = R[i];//左边扫描结束
    }
    R[i] = tmp;
        //输出每趟划分后的序列
    for (int i = 0; i <= 6; i++)
    {
        cout << R[i]<<"  ";
    }
    cout << endl;

    return i;
}

快读排序其实是一个递归的过程,递归出口为当序列中没有元素或只有一个元素。下面的代码便是递归先对左区间序列进行排序,再对右区间序列进行排序。

递归调用

void QuickSort(int R[], int s, int t)
{
    int i;
    if (s < t)//区间内至少存在两个元素的情况
    {
        i = partition(R, s, t);
        QuickSort(R, s, i - 1);//对左区间递归排序,二趟排序
        QuickSort(R, i + 1, t);//对右区间递归排序,三趟排序
    }
}

最后我们可以随便给一个数组进行排序测试

int main()
{
    int R[] = { 6,10,10,3,7,1,8 };
    QuickSort(R, 0, 6);//后面两个参数为下标
    return 0;
}

完整代码如下

#include <iostream>
using namespace std;

int partition(int R[], int s, int t)//一趟划分
{
    int i = s, j = t;
    int tmp = R[i];//以第一个数为基准
    while (i<j)//两端交替向中间扫描,直到i=j为止
    {
        while (j>i&&R[j]>=tmp)//从右向左扫描
        {
            j--;
        }
        R[i] = R[j];//右边扫描结束

        while (i<j&&R[i]<=tmp)
        {
            i++;
        }
        R[j] = R[i];//左边扫描结束
    }
    R[i] = tmp;
        //输出每趟划分后的序列
    for (int i = 0; i <= 6; i++)
    {
        cout << R[i]<<"  ";
    }
    cout << endl;

    return i;
}

void QuickSort(int R[], int s, int t)
{
    int i;
    if (s < t)//区间内至少存在两个元素的情况
    {
        i = partition(R, s, t);
        QuickSort(R, s, i - 1);//对左区间递归排序,二趟排序
        QuickSort(R, i + 1, t);//对右区间递归排序,三趟排序
    }
}

int main()
{
    int R[] = { 6,10,10,3,7,1,8 };
    QuickSort(R, 0, 6);//后面两个参数为下标
    return 0;
}

最终输出采用快速排序后4趟排序结果


image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 啥是快排 快排就是选定一个基准元素pirot,经过一趟排序后,使得pirot前面的元素都比它小,pirot后面的元...
    元气满满321阅读 4,460评论 3 7
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,235评论 0 52
  • 题目 链接:PAT (Basic Level) Practice 1045 快速排序 著名的快速排序算法里有一个经...
    dk_qi阅读 310评论 0 0
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 1,287评论 0 2
  • 算法原理 快速排序是目前在实践中非常高效的一种排序算法,它不是稳定的排序算法,平均时间复杂度为O(nlogn),最...
    巴巴呀呀阅读 492评论 0 1