• 快速排序


    任务描述

    本关任务:实现快速排序算法,并将乱序数列变成升序。

    相关知识——快速排序

    快速排序是最常用的一种排序算法,它的特点是速度快、效率高。快速排序的基本思想:选择一个关键值作为基准值。比基准值小的都在左边序列(一般是无序的),比基准值大的都在右边(一般是无序的)。一般选择序列的第一个元素作为基准值。

    • 算法步骤:

      1. 从数列中挑出一个元素作为基准元素(本关任务采用待排序区间的首个元素为),称为基准pivot

      2. 分区partition操作:比基准值小的元素放在左边,比基准值大的元素放在右边; 分区处理

      3. 递归recursive:把小于基准值元素的子数列和大于基准值元素的子数列分别递归排序。

    编程要求

    本关的编程任务是补全sort.h文件中的partitionquicksort函数,利用自上而下的递归方法实现升序序列的快速排序,并输出首次分区处理结果,以及最后的有序序列,并输出首次分区处理结果以及最后元素的升序序列。具体要求如下: `// 编程实现arr[s~e]分区:选定首个元素为基准,左边比基准小,右边比基准大 // 返回基准所处位置 int partition_array(int* arr, int s, int e);

    // 编程实现快速排序:利用自上而下的递归方法实现升序序列的快速排序,并输出首次分区处理结果,以及最后的有序序列 // 函数参数:有序数组arr 初始l=0,r=n-1 void quick_sort(int* arr, int l, int r);`

    评测说明

    本关中包含三个文件分别是: step4/sort.h :此文件为学员文件,其中partition和quicksort函数待补充完整 step4/main.cpp:此文件为评测文件(含main函数),引用“sort.h”。 (上述三个文件可通过点击在代码取的右上角文件夹中的step4文件夹中查看)

    输入输出说明

    输入n(1<=n<=100),输入n个整数,按升序排序规则,输出以首个元素作为基准元素的第一次分区处理结果(占一行,元素用一个空格隔开),利用递归方法实现快速排序后的升序序列(占一行,元素用一个空格隔开)。

    测试输入: 10 7 1 4 6 8 9 5 2 3 10 预期输出: 3 1 4 6 2 5 7 9 8 10 1 2 3 4 5 6 7 8 9 10

    测试输入: 15 3 44 38 5 47 15 36 26 27 2 46 4 19 50 48 预期输出: 2 3 38 5 47 15 36 26 27 44 46 4 19 50 48 2 3 4 5 15 19 26 27 36 38 44 46 47 48 50

     

    main.cpp

    //
    //  main.cpp
    //  Sort
    //
    //  Created by ljpc on 2018/4/20.
    //  Copyright 漏 2018骞  ljpc. All rights reserved.
    //
    
    #include <iostream>
    #include "sort_.h"
    
    int main(int argc, const char * argv[]) {
        // insert code here...
        // std::cout << "Hello, World!
    ";
    
        int n;
        scanf("%d", &n);
        
        int *arr;
        arr = (int*)malloc(sizeof(int)*n);
        
        for (int i=0; i<n; i++)
        {
            scanf("%d", &arr[i]);
        }
        
        sort_array(arr, n);
        
        return 0;
    }

    sort.h

    //
    //  sort_.h
    //  Sort
    //
    //  Created by ljpc on 2018/4/20.
    //  Copyright © 2018年 ljpc. All rights reserved.
    //
    
    #ifndef sort__h
    #define sort__h
    
    #include <cstdio>
    #include <algorithm>
    
    using namespace std;
    
    void print_array(int *arr, int n);
    // 打印数组
    
    void sort_array(int *arr, int n);
    // 数组排序
    
    #endif /* sort__h */

    sort.cpp

    #include <iostream>
    using namespace std;
    
    // 打印arr数组的arr[0~n-1]元素,元素之间使用一个空格相隔
    void print_array(int arr[], int n);
    
    // 编程实现arr[s~e]分区:选定一个基准,左边比基准小,右边比基准大
    // 返回基准所处位置
    int partition_array(int* arr, int s, int e);
    
    //  编程实现快速排序:利用自上而下的递归方法实现升序序列的快速排序,并输出首次分区处理结果,以及最后的有序序列
    //  函数参数:有序数组arr 初始l=0,r=n-1
    void quick_sort(int* arr, int l, int r);
    
    void print_array(int arr[], int n)
    
    {
        for (int i = 0; i < n; i++)
        {
            cout << arr[i] << " ";
        }
        cout << endl;
    }
    
    int partition_array(int* arr, int left, int right)
    {   
        int i = left;  
        int j = right;
        int tmp=arr[i];
        while(i<j){
            while(j>i&&arr[j]>=tmp)j--;
            arr[i]=arr[j];
            while(i<j&&arr[i]<=tmp)i++;
            arr[j]=arr[i];
        }
        arr[i]=tmp;
        return i;
    }
    void quick_sort(int* arr, int left, int right)
    
    {
        // 请在这里补充代码,完成本关任务
        /********** Begin *********/
        static int level = 1;//静态变量
        
        int i, j;
        
        if (left < right)
        {
            int pivot = partition_array(arr, left, right);
            if(level==1)print_array(arr,right+1);
            level++;
            quick_sort(arr, left, pivot-1);
            quick_sort(arr, pivot+1, right);
        }  
        /********** End **********/
    }
  • 相关阅读:
    Object类学习
    Thread.State 线程状态
    Thread.UncaughtExceptionHandler
    apply和call的区别
    如何实现border-width:0.5px;
    table固定头部,表格tbody可上下左右滑动
    canvas画布实现手写签名效果
    ES6学习笔记
    for循环中执行setTimeout问题
    javaScript函数提升及作用域
  • 原文地址:https://www.cnblogs.com/xxxsans/p/14004709.html
Copyright © 2020-2023  润新知