排序【模板】

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

输入一个长度为n的数组A,可能有重复元素,请返回升序排列后的数组。

本题是为了练习排序算法,禁用标准库,不要为了AC骗自己

输入描述:

第一行1个整数n,表示数组长度。

第二行n个整数,表示a1,a2,...ana_1, a_2, ...a_na1​,a2​,...an

1≤n≤1051\le n \le 10^51≤n≤105
−109≤a[i]≤109-10^9 \le a[i] \le 10^9−109≤a[i]≤109

输出描述:

输出一行n个整数,表示排列后的数组。

输入:

5
5 4 3 2 1

输出:

1 2 3 4 5

答案:

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int a[N];
int n , m ;
void quick_sort(int a[], int l , int r)
{
    if (l >= r) return ;
    int k=a[l],i=l-1,j=r+1;
    while (i < j)
    {
        do j -- ; while (a[j] > k);
        do i ++ ; while (a[i] < k);
        if (i < j) 
        {
           swap(a[i] , a[j]);
        }
        
    }
    quick_sort(a,l , j);
    quick_sort(a,j + 1 , r);
}

int main()
{
    cin >> n;
    for (int i = 0 ; i < n ; i ++) scanf("%d",&a[i]);
    
    quick_sort(a, 0 , n -1);
    
    for (int i = 0 ; i < n ; i ++) printf("%d " , a[i]);
}

在这里使用的是快速排序的思想,确定一个中间值从两边向中间逐一排序小的放前面大的放后面

之后再分两段进行分别比较,再递归

解释(ai)

快速排序(Quick Sort)是一种非常高效的排序算法,它采用分而治之的策略来对一个数组进行排序。快速排序的基本思想是:选择一个元素作为基准(pivot),将数组分为两部分,一部分都小于基准,另一部分都大于基准,然后递归地对这两部分进行快速排序,以此达到整个数组有序的目的。

下面是一个快速排序的C++实现示例:

#include <iostream>  
#include <vector>  
using namespace std;  
  
// 快速排序的递归函数  
void quickSort(vector<int>& arr, int left, int right) {  
    if (left >= right) {  
        // 如果左边界大于等于右边界,说明当前子数组已经有序或为空,直接返回  
        return;  
    }  
  
    // 使用partition函数找到基准元素的正确位置,并返回这个位置  
    int pivotIndex = partition(arr, left, right);  
  
    // 递归地对基准元素左边的子数组进行快速排序  
    quickSort(arr, left, pivotIndex - 1);  
  
    // 递归地对基准元素右边的子数组进行快速排序  
    quickSort(arr, pivotIndex + 1, right);  
}  
  
// 分区函数,用于将数组分为小于基准和大于基准的两部分  
// 并返回基准元素在排序后数组中的正确位置  
int partition(vector<int>& arr, int left, int right) {  
    // 选择最右边的元素作为基准  
    int pivot = arr[right];  
    int i = left - 1; // i是小于基准元素的区域的边界  
  
    for (int j = left; j < right; j++) {  
        // 如果当前元素小于或等于基准,则交换  
        if (arr[j] <= pivot) {  
            i++;  
            swap(arr[i], arr[j]);  
        }  
    }  
  
    // 将基准元素放到中间位置  
    swap(arr[i + 1], arr[right]);  
  
    // 返回基准元素在排序后数组中的位置  
    return i + 1;  
}  
  
int main() {  
    vector<int> arr = {10, 7, 8, 9, 1, 5};  
    quickSort(arr, 0, arr.size() - 1);  
  
    // 输出排序后的数组  
    for (int num : arr) {  
        cout << num << " ";  
    }  
    cout << endl;  
  
    return 0;  
}

在这个例子中,我使用了vector<int>来存储数组,因为它更加灵活且易于管理内存。quickSort函数是递归的,它首先检查左边界是否大于等于右边界,如果是,则直接返回。然后,它调用partition函数来找到基准元素的正确位置,并对基准元素左右两边的子数组进行递归排序。

partition函数遍历数组,将所有小于或等于基准的元素移动到基准的左边,并返回基准在排序后数组中的位置。注意,这里的基准元素并不一定是数组中的最小值或最大值,它只是用来帮助分区的。

最后,main函数中创建了一个未排序的数组,调用quickSort函数进行排序,并打印排序后的结果。

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值