美文网首页
交换排序之“快速排序”(C++实现)

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

作者: cysAAAA | 来源:发表于2019-03-29 20:29 被阅读0次

快速排序(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

相关文章

  • 七大排序算法之快速排序

    七大排序算法之快速排序 @(算法笔记)[排序算法, 快速排序, C++实现] [TOC] 快速排序的介绍: 快速排...

  • 1.2-交换排序-快速排序

    参考链接 交换排序:快速排序(Quick Sort) 白话经典算法系列之六 快速排序 快速搞定 快速排序是C.R....

  • 不积跬步之快速排序

    快速排序使用了分治思想来实现。 和冒泡排序一样,快速排序也属于交换排序,通过元素直接的比较和交换位置来达到排序的目...

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

    快速排序(quick sort)是冒泡排序改进而来的,基本思想是在待排序的n个元素中,取第一个元素作为基准,将该元...

  • 基础算法|快速排序

    快速排序(Quicksort),是对冒泡排序算法的一种改进。 快速排序算法通过多次比较和交换来实现排序,其排序流程...

  • 冒泡排序、快速排序、二分插入排序c++实现

    先奉上一段in-place交换的方法 冒泡排序实现 快速排序实现 二分插入排序

  • 各种排序算法实现

    C++实现各种排序算法。上张图。 自定义的swap函数。 冒泡排序 插入排序 希尔排序 选择排序 快速排序 归并排...

  • 直接插入排序(JAVA)

    前言   本文集将用java语言实现包括插入排序(直接插入、折半插入、希尔排序),交换排序(快速排序和冒泡排序),...

  • PHP 实现快速排序

    导语 这篇了解下快速排序。 快速排序 快速排序(英语:Quicksort),又称划分交换排序(partition-...

  • java--快速排序

    1:基本思想: 快速排序是属于交换类排序,采用不断的比较和移动来实现排序。快速排序是一种非常高效的排序算法,它的实...

网友评论

      本文标题:交换排序之“快速排序”(C++实现)

      本文链接:https://www.haomeiwen.com/subject/gawrbqtx.html