版权声明:转载请注明出处。 https://blog.csdn.net/qq_37708702/article/details/81513209
题目链接
Problem Description
山东理工大学有很多学生,当然也有很多美女,机械实验班的学委(外号:大王八)很想找个女朋友,但他想找个身高和自己相配的女生做女朋友,现有理工大N个美女的身高数据,但由于N的值较大,为了尽快找到合适的女友,大王八想请你帮他完成这N个美女的身高排序,按降序排列。
Input
输入包括两行,第一行是一个正整数N(N<=1000000),表示理工大共N个美女。第二行有N个正整数分别表示N位美女的身高,每个正整数的值不会超过10^9。 (输入数据之间会用空格隔开)
Output
输出只有一行,为这N个数的降序序列,数与数之间用空格隔开。
Sample Input
5
1 3 2 5 4
Sample Output
5 4 3 2 1
Hint
Source
AC代码:
1.快排
#include<iostream>
#include<cstdio>
using namespace std;
int n,arr[1000005];
void QuickSort(int arr[],int s,int e){
if(s >= e)
return;
int i,j,k;
i = s,j = e,k = arr[s];
while(i < j){
while(i < j && arr[j] <= k)//必须要加等于,详细解释在下面,会在两个相等的数字之间进入死循环
j--;
swap(arr[i],arr[j]);
while(i < j && arr[i] >= k)//必须要加等于,详细解释在下面,会在两个相等的数字之间进入死循环
i++;
swap(arr[i],arr[j]);
}
QuickSort(arr,s,i - 1);
QuickSort(arr,i + 1,e);
return;
}
int main(){
scanf("%d",&n);
for(int i = 0;i < n;i++)
scanf("%d",&arr[i]);
QuickSort(arr,0,n - 1);
for(int i = 0;i < n;i++)
cout << arr[i] << " ";
return 0;
}
解释:
30 27 30 2 8 12 2 8 89 93
哨兵是j指针指的数30,当前i指针指的是第一个数30,j指针指的是倒数第三个数8,从前往后找一个比30>=的数,找到了30,接
下来两者进行交换,从后往前继续找,又找到30,无限的进行循环
2.归并排序
#include<iostream>
#include<cstdio>
using namespace std;
int n,arr[1000005],b[1000005];
void Merge(int arr[],int l,int r,int s,int e){
int idx,pa,pb;
idx = 0,pa = l,pb = s;
while(pa <= r && pb <= e){
if(arr[pa] > arr[pb])
b[idx++] = arr[pa++];
else
b[idx++] = arr[pb++];
}
while(pa <= r)//如果左边的还没拆分完,就把剩余的加上
b[idx++] = arr[pa++];
while(pb <= e)
b[idx++] = arr[pb++];
for(int i = 0;i < e - l + 1;i++)// 注意: e - l + 1,参数是下标
arr[l + i] = b[i];
return;
}
void MergeSort(int arr[],int l,int r){
int mid;
if(l >= r)//如果二分分到两边相等,则不需要在进行二分
return;
mid = l + (r - l) / 2;
MergeSort(arr,l,mid);//无限对左边进行拆分
MergeSort(arr,mid + 1,r);//无限对右边进行拆分
Merge(arr,l,mid,mid + 1,r);//把左右两边拆分的进行合并
return;
}
int main(){
scanf("%d",&n);
for(int i = 0;i < n;i++)
scanf("%d",&arr[i]);
MergeSort(arr,0,n - 1);
for(int i = 0;i < n;i++)
printf("%d ",arr[i]);
return 0;
}