链接:登录—专业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
函数进行排序,并打印排序后的结果。