• 洛谷P1177 【模板】快速排序 (归并排序)


    题目描述
    利用快速排序算法将读入的N个数从小到大排序后输出。

    快速排序是信息学竞赛的必备算法之一。对于快速排序不是很了解的同学可以自行上网查询相关资料,掌握后独立完成。(C++C++选手请不要试图使用STL,虽然你可以使用sort一遍过,但是你并没有掌握快速排序算法的精髓。)

    输入输出格式
    输入格式:
    第11行为一个正整数N,第2行包含N个空格隔开的正整数a i ,为你需要进行排序的数,数据保证了Ai不超过10000000001000000000。
    输出格式:
    将给定的N个数从小到大输出,数之间空格隔开,行末换行且无空格。

    输入输出样例
    输入样例#1:
    5
    4 2 4 5 1
    输出样例#1
    1 2 4 4 5

    归并排序视频讲解:
    http://www.bilibili.com/video/av9982752?share_medium=android&share_source=qq&bbid=NgZgUGVXYVluVmVWKlYqinfoc&ts=1562894986507

    参考代码:

    #include <iostream>
    #include <algorithm>
    #include <cmath>
    #include <string>
    using namespace std;
    void merge(int arr[],int L,int M,int R)
    {
    	int left_size=M-L;
    	int right_size=R-M+1;
    	int left[50000];
    	int right[50000];
    	int i,j,k;
    	for(int i=L;i<M;i++)
    		left[i-L]=arr[i];
    	for(int i=M;i<=R;i++)
    		right[i-M]=arr[i];
    	i=0;j=0;k=L;
    	while(i<left_size&&j<right_size)
    	{
    		if(left[i]<right[j])
    			arr[k++]=left[i++];
    		else
    			arr[k++]=right[j++];
    	}
    	while(i<left_size)
    		arr[k++]=left[i++];
    	while(j<right_size)
    		arr[k++]=right[j++];
    }
    void mergesort(int arr[],int L,int R)
    {
    	if(L==R)
    		return;
    	else{
    		int M=(L+R)/2;
    		mergesort(arr,L,M);
    		mergesort(arr,M+1,R);
    		merge(arr,L,M+1,R);
    	}
    }
    int main()
    {
    	int n,arr[100001];
    	cin>>n;
    	for(int i=0;i<n;i++)
    		cin>>arr[i];
    	int L=0,R=n-1;
    	mergesort(arr,L,R);
    	for(int i=0;i<=R;i++)
    		cout<<arr[i]<<" ";
    	cout<<endl;
    	return 0;
    }
    

    参考代码2:

    #include <iostream>
    #include <algorithm>
    #include <cmath>
    #include <string>
    using namespace std;
    void merge(int *arr, int L, int M, int R){
    	int left_size = M-L;
    	int right_size = R-M+1;
    	int *L_arr = new int[left_size];
    	int *R_arr = new int[right_size];
    
    	for(int i=L; i<M; i++)
    		L_arr[i-L] = arr[i];
    	for(int i=M; i<=R; i++)
    		R_arr[i-M] = arr[i];
    
    	int i = 0, j = 0, k = L;
    	while(i < left_size && j < right_size)
    		if(L_arr[i]<R_arr[j])
    			arr[k++]= L_arr[i++];
    		else
    			arr[k++] = R_arr[j++];
    
    	while(i < left_size)
    		arr[k++] = L_arr[i++];
    	while(j < right_size)
    		arr[k++] = R_arr[j++];
    }
    
    void merge_sort(int *arr, int L, int R)
    {
    	if(L == R)
    		return;
    	else
    	{
    		int M = (L+R)/2;
    		merge_sort(arr, L, M);
    		merge_sort(arr, M+1, R);
    		merge(arr, L, M+1, R);
    	}
    }
    void print_sort(int *arr, int num)
    {
    	for(int i=0; i < num; i++)
    		cout << arr[i] <<" ";
    	cout << endl;
    }
    int main()
    {
    	int arr[10]={6, 3, 2, 7, 5, 1, 4, 0, 8, 9};
    	merge_sort(arr, 0, 9);
    	print_sort(arr, 10);
    	return 0;
    }
    
  • 相关阅读:
    PHP中关于字符串的连接
    好用的FireFox(FF)插件
    Scripted Operation
    Scripted device
    chgrp chown
    wait_for_devices
    mysql create user
    mysql
    create user mysql
    Inserting/Removing shutters and filters
  • 原文地址:https://www.cnblogs.com/yonglin1998/p/11780840.html
Copyright © 2020-2023  润新知