zoukankan      html  css  js  c++  java
  • 归并排序

    题目描述

    给定你一个长度为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 }
  • 相关阅读:
    【LOJ #2320】「清华集训 2017」生成树计数
    【LOJ #2983】「WC2019」数树
    【学习笔记】一类极角排序题
    【学习笔记】斐波那契数列的简单性质
    【LOJ #6041】「雅礼集训 2017 Day7」事情的相似度
    【日常训练】迪杂斯特
    大数据应用技术课程实践--选题与实践方案
    14 深度学习-卷积
    13-垃圾邮件分类2
    12.朴素贝叶斯-垃圾邮件分类
  • 原文地址:https://www.cnblogs.com/pythen/p/11769490.html
Copyright © 2011-2022 走看看