蓝桥杯练习(基础一)

基础练习01 数列排序

问题描述
  给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200
输入格式
  第一行为一个整数n。
  第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000。
输出格式
  输出一行,按从小到大的顺序输出排序后的数列。
 
样例输入
5
8 3 6 4 9
样例输出
3 4 6 8 9
#include<iostream>
#include<vector>
using namespace std;

// 快速排序(从小到大)
void quickSort(int left, int right, vector<int>& arr)
{
    if(left >= right)
        return;
    int i, j, base;
    i = left, j = right;
    base = arr[left];  // 取最左边的数为基准数
    while (i < j)
    {
        while (arr[j] >= base && i < j)
            j--;
        while (arr[i] <= base && i < j)
            i++;
        if(i < j)
        {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
    // 基准数归位
    arr[left] = arr[i];
    arr[i] = base;
    // 递归左边
    quickSort(left, i-1, arr);
    // 递归右边
    quickSort(i+1, right, arr);
}

int main(){
    int n;
    cin >> n;
    vector<int> a(n);

    // 数据读入
    for(int i=0; i<n; ++i){
        cin >> a[i];
    }
    // 快排
    quickSort(0, n-1, a);
    // 数据输出
    for(int i=0; i<n; ++i){
        cout << a[i];
        if(i != n-1){
            cout<< " ";
        }
    }
}

个人总结

  这个题考察排序算法,本来是想用冒泡做的,但是想想不能老用冒泡(自己只会写冒泡)吧,而且时间复杂度较高。这个题用的快排做的,emmm,对,看了好多别人的资料O(∩_∩)O哈哈~,之前数据结构老师教的全还回去了。(>人<)

知识拓展

  快速排序:简单点说就是 在一组数中选定一个数为基数进行一次简单排序,使得 基数左边的数都比基数小(大)基数右边的数都比基数大(小),然后采用分治的思想,对基数左右边两序列进行递归操作,最终使得整个序列有序。需要注意的是,如果是从左方选取基数,应从右方进行搜索;若从右方选取的基数,则从左方进行搜索。

  附个大佬讲解快排的博文:https://blog.csdn.net/qq_28584889/article/details/88136498

猜你喜欢

转载自www.cnblogs.com/DullRabbit/p/12555900.html
今日推荐