快速排序·三平均划分法

news/2024/5/19 22:17:14 标签: 算法, 快速排序, 数据结构, 排序算法

快速排序

  • 题目信息
    • 测试样例
  • 解答
  • 想法

题目信息

要求根据给定输入,按照课堂给定的快速排序算法进行排序,输出排序结果和median3的返回值。

1 cutoff值为5,不足cutoff使用插入排序。
2 输入、输出格式参见测试用例。

测试样例

测试样例1

41
17
34
0
19
#
After Sorting:
0 17 19 34 41 
Median3 Value:
none

测试样例2

61
59
82
-10
31
-2
-3
10
2
108
12
80
-21
127
12
#
After Sorting:
-21 -10 -3 -2 2 10 12 12 31 59 61 80 82 108 127 
Median3 Value:
12 -3 61 

解答

#include<iostream>
#include<algorithm>

using namespace std;

int sz[100], median[100];
int mNum = 0;

int Median3(int lt, int rt)
{//三平均划分法
    int Middle = (lt + rt) / 2;
    if (sz[lt] > sz[Middle])
    {//满足中间的要比左边的大
        swap(sz[lt], sz[Middle]);
    }
    if (sz[lt] > sz[rt])
    {//满足右边的要比左边的大
        swap(sz[lt], sz[rt]);
    }
    if (sz[Middle] > sz[rt])
    {//满足右边的比中间的大
        swap(sz[Middle], sz[rt]);
    }
    swap(sz[Middle], sz[rt - 1]);//将中间的放置在倒数第二个的位置
    median[mNum++] = sz[rt - 1];//将中间值存在median数组中
    return sz[rt - 1];
}//实际上是我们抓取了三个数,第一个中间的最后一个按照大小排序后,取出中间的那个

void InsertSort(int lt, int rt)
{
    for (int i = lt + 1; i <= rt; i++)
    {
        int temp = sz[i];
        if (sz[i] < sz[i - 1])
        {
            int j = lt;
            while (sz[j] < temp)
            {
                j++;
            }
            for (int k = i; k > j; k--)
            {//后移
                sz[k] = sz[k - 1];
            }
            sz[j] = temp;
        }
    }
}

void QuickSort(int lt, int rt)
{
    if (rt - lt < 5)
    {//个数小于5的时候使用插入排序的方法
        InsertSort(lt, rt);
    }
    else if (lt < rt)
    {
        int pivot = Median3(lt, rt);//得到了中间的那个数
        int L = lt, R = rt - 1; //从左到右的扫描从第一个元素开始,从右到左的扫描从倒数第二个元素开始
        while (L < R)
        {//找到左边的比中数大,右边的比中数小,然后交换之
            while (L < R && sz[++L] < pivot);
            while (L < R && sz[--R] > pivot);
            swap(sz[L], sz[R]);
        }
        swap(sz[L], sz[rt - 1]);//将中数放置在中间的位置

        int Middle = L; // 中轴
        if (Middle)
        {//递归下去
            QuickSort(lt, Middle - 1);
            QuickSort(Middle + 1, rt);
        }
    }
}

int main()
{
    //freopen("/Users/zhj/Downloads/test.txt", "r", stdin);
    string s;
    int len = 0;
    while (true)
    {
        cin >> s;
        if (s[0] == '#')
        {
            break;
        }
        sz[len] = atoi(s.c_str());
        ++len;
    }
    QuickSort(0, len - 1);

    cout << "After Sorting:" << endl;
    for (int i = 0; i < len; ++i)
    {
        cout << sz[i] << " ";
    }
    cout << endl;

    cout << "Median3 Value:" << endl;
    if (len > 5)
    {
        for (int i = 0; i < mNum; ++i)
        {
            cout << median[i] << " ";
        }
    }
    else
    {
        cout << "none";
    }
    cout << endl;
}

想法

  1. 本题考察的就是快速排序的三平均划分法,实现一种分治的思想。
  2. 首先选出三个值,第一个数,中间的数,最后一个数,将这三个数按大小排好序,A < B < C
  3. 对剩余的数字,将小于B的数放置在左边,大于B的数放置在右边。
  4. 对左右两堆数实现递归,不断循环上述过程。
  5. 如果剩余的数小于等于5个的时候就是用插入排序的方式。

http://www.niftyadmin.cn/n/1342392.html

相关文章

Java+SQLite+JDBC+Swing实现校园接单平台二手交易平台

Java大作业程序功能说明程序运行方式程序内容说明GitHub地址源码程序功能说明 程序主要实现了一个类似于发布求助信息&#xff0c;帮助他人的求助的平台&#xff0c;每一个用户都可以注册账号并登陆账号&#xff0c;然后发布自己的求助信息&#xff0c;如“求租自行车一天”&a…

wps右键新建里面没有word和excel_WPS还不会?教你3种打开方式.....

WPS是一款常用的办公软件&#xff0c;基本上每一台电脑都会有&#xff0c;可以用来做基本的文件存档&#xff0c;文字排版等等。目前已经升级成了WPS&#xff0c;所以如果电脑没有的话可以百度关键词WPS下载安装(包含DOC文档、XLSX工作表、PPT演示文稿)。打开WPS的方法相信通过…

python刷票脚本_python自动刷票脚本(在不封IP的情况下)

# -*- coding:UTF-8 -*- from selenium import webdriver from selenium.common.exceptions import NoSuchElementException as SEE from selenium.webdriver.common.keys import Keys import time def voted(): 功能&#xff1a;自动刷票 browser webdriver.Firefox() browse…

WordPress安装WPCOS插件同步文件至腾讯云COS设置教程

一般我们使用WordPress程序的时候&#xff0c;静态文件都会自动放在网站目录uploads中。有些网友图片文件比较多&#xff0c;而且服务器带宽不足&#xff0c;这样会发现网站打开和图片加载速度很慢。即便我们可以通过升级服务器配置的办法提高速度&#xff0c;但是同样也会增加…

python pandas读取文件内容_python Pandas 读取数据,写入文件

pandas 选取数据 iloc和 loc的用法不太一样&#xff0c;iloc是根据索引&#xff0c; loc是根据行的数值>>> import pandas as pd >>> import os >>> os.chdir("D:\\") >>> d pd.read_csv("GWAS_water.qassoc", delim…

Java 面向对象 一

1&#xff0c;对象&#xff1a;对象是类的一个实例&#xff0c;有状态和行为。例如&#xff0c;一条狗是一个对象&#xff0c;它的状态有&#xff1a;颜色、名字、品种&#xff1b;行为有&#xff1a;摇尾巴、叫、吃等。是该类事物的具体体现 2&#xff0c;类&#xff1a;类是一…

linux修改时间_‘’Linux‘’就该这样学

【Linux 是什么】Linux 是一个操作系统&#xff0c;如同 Windows、Mac OS。操作系统在整个计算机系统中&#xff0c;是在硬件→内核→系统调用→应用程序体系里负责内核→系统调用模块&#xff0c;但直观的看&#xff0c;操作系统还包含一些在其上运行的应用程序&#xff0c;比…

Shell排序

Shell排序增量每次除以2递减的程序原理其它形式的Shell排序Hibbard增量序列Shell最好的代价增量每次除以2递减的 程序 void ModInsSort(int array[], int n, int delta) {for (int i delta; i < n; i delta){for (int j i; j > delta; j - delta){if (array[j] <…