• 归并排序


    题目描述

    给定你一个长度为n的整数数列。

    请你使用归并排序对这个数列按照从小到大进行排序。

    并将排好序的数列按顺序输出。

    输入格式

    输入共两行,第一行包含整数 n。

    第二行包含 n 个整数(所有整数均在1~109109范围内),表示整个数列。

    输出格式

    输出共一行,包含 n 个整数,表示排好序的数列。

    数据范围

    1n1000001≤n≤100000

    输入样例:

    5
    3 1 2 4 5

    输出样例:

    1 2 3 4 5

    排序思想:

    1.确定分界点。mid=(l+r)/2

    2.递归排序left right

    3.归并---合二为一:(双指针),把较小的数添加到临时数组中

     4.赋值临时数组中的有序元素到原来的数组。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int N=100010;
     4 int q[N],tmp[N];
     5 void merge_sort(int q[],int l,int r)
     6 {
     7     if(l>=r) return;    //如果只有一个数,或没有数,返回
     8     int mid=l+r>>1;  
     9     merge_sort(q,l,mid);
    10     merge_sort(q,mid+1,r);
    11     int k=0,i=l,j=mid+1;   //采用双指针,一个指向左边,一个指向右边,不断把较小的数加入临时数组
    12     while(i<=mid &&j<=r)   
    13         if(q[i]<=q[j]) 
    14             tmp[k++]=q[i++];
    15         else 
    16             tmp[k++]=q[j++];
    17     while(i<=mid) tmp[k++]=q[i++];  //将剩余的数一起添加到临时数组右侧
    18     while(j<=r) tmp[k++]=q[j++];
    19     for(int i=l,j=0;i<=r;i++,j++)  //将临时数组中的有序数复制到原来的q数组
    20         q[i]=tmp[j];
    21 }
    22 int main(){
    23     int n;
    24     cin>>n;
    25     for(int i=0;i<n;i++)
    26         scanf("%d",&q[i]);
    27     merge_sort(q,0,n-1);
    28     for(int i=0;i<n;i++)
    29         printf("%d ",q[i]);
    30     return 0;
    31 }
  • 相关阅读:
    从开发者角色到产品角色转换
    前端开发做什么?
    最近的前端开发认知总结
    最近的Vue知识总结
    计算机网络
    javascript 字符串加密的几种方法
    JSON数据解析
    JAVA 自定义状态码
    JAVA jdbc获取数据库连接
    JAVA通过md5方法进行加密
  • 原文地址:https://www.cnblogs.com/pythen/p/11769490.html
Copyright © 2020-2023  润新知