# 标准方法:归并排序
# 该算法的优点就是不用额外的空间,只是在当前的列表中处理
import sys
def merge(left, right):
i,j =0,0
result =[]while i <len(left) and j <len(right):if left[i]<= right[j]:
result.append(left[i])
i +=1else:
result.append(right[j])
j +=1
result += left[i:]
result += right[j:]return result
def Merge_sort(lists):iflen(lists)<=1:return lists
num =len(lists)//2
left =Merge_sort(lists[:num])
right =Merge_sort(lists[num:])returnmerge(left, right)if __name__ =='__main__':
lines = sys.stdin.readlines()
lists = lines[0].strip().split()print("排序前序列为:",)for i in lists:print(i, end=" ")print("\n排序后结果为:")for i in(Merge_sort(lists)):print(i, end=" ")
方法二:C++标准方法(不需要额外的列表空间)
#include <iostream>
using namespace std;voidMerge(int *initList, int *mergedList,const int l,const int m,const int n);voidMergePass(int *initList, int *resultList,const int n,const int s);voidMergeSort(int *a, int n);
int main(){//int a[] = {0,23,47,81,95,7,14,39,55,62,74};//for (int k=0;k<11;k++)//{// cout << a[k] << " ";//}//cout << endl;//int b[11] ={0};//Merge(a,b,1,4,10);//for (int k=0;k<11;k++)//{// cout << b[k] << " ";//}//cout << endl;//int m[] = {0,26,5,77,1,61,11,59,15,48,19};//int n[11] = {0};//for (int k=0;k<11;k++)//{// cout << m[k] << " ";//}//cout << endl;////MergePass(m,n,10,1);//for (int k=0;k<11;k++)//{// cout << n[k] << " ";//}//cout << endl;//MergePass(n,m,10,2);//for (int k=0;k<11;k++)//{// cout << m[k] << " ";//}//cout << endl;//MergePass(m,n,10,4);//for (int k=0;k<11;k++)//{// cout << n[k] << " ";//}//cout << endl;//MergePass(n,m,10,8);//for (int k=0;k<11;k++)//{// cout << m[k] << " ";//}//cout << endl;//声明一个数组,并打印出所有的数组元素
int x[]={0,26,5,77,1,61,11,59,15,48,19};for(int k=0;k<11;k++){
cout << x[k]<<" ";}
cout << endl;//将该数组进行归并排序,然后打印出数组中的所有值MergeSort(x,10);for(int k=0;k<11;k++){
cout << x[k]<<" ";}
cout << endl;system("pause");return0;}voidMerge(int *initList, int *mergedList,const int k,const int m,const int n){
int i,j,iresult;for(i =k,j = m+1,iresult= k;i<=m && j <=n; iresult++){//两个数组中的取出的元素哪个小哪个就放到新的有序数组中if(initList[i]<= initList[j]){
mergedList[iresult]= initList[i];
i++;}else{
mergedList[iresult]= initList[j];
j++;}}copy(initList+i,initList+m+1,mergedList+iresult);//把initList中从下标i开始,到下标m+1之前的所有元素拷贝到mergedList中下标从iresult开始的数组中copy(initList+j,initList+n+1,mergedList+iresult);//把initList中从下标j开始,到下标n+1之前的所有元素拷贝到mergedList中下标从iresult开始的数组中}voidMergePass(int *initList, int *resultList,const int n,const int s){
int i;for(i =1;i<=n-2*s+1;i+=2*s){Merge(initList,resultList,i,i+s-1,i+2*s-1);}if((i+s-1)<n){Merge(initList,resultList,i,i+s-1,n);}else{copy(initList+i,initList+n+1,resultList+i);}}voidMergeSort(int *a, int n){
int *tempList =newint[n+1];for(int i =1;i<n;i*=2){MergePass(a,tempList,n,i);
i*=2;MergePass(tempList,a,n,i);}delete[]tempList;
tempList =NULL;}