找女朋友 [快排 归并排序]

12 篇文章 0 订阅
3 篇文章 0 订阅

题目链接
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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值