合并排序

摘要:
然后将有序子序列合并到整个有序序列中。

合并排序:把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。

效率:⊙(nlogn)

 伪代码:

 1 Mergesort(A[0..n-1])
 2 //递归调用mergesort来对数组A[0..n-1]排序
 3 //输入:一个可排序数组A[0..n-1]
 4 //输出:非降序排列的数组A[0..n-1]
 5 if n>1
 6     copy A[0..[n/2]-1] to B[0..[n/2]-1]
 7     copy A[[n/2]..n-1] to C[0..[n/2]-1]
 8     Mergesort(B[0..[n/2]-1]
 9     Mergesort(C[0..[n/2]-1]
10     Merge(B,C,A)
 1 Merge(B[0..p-1],C[0..q-1],A[0..p+q-1])
 2 //将两个有序数组合并为一个有序数组
 3 //输入:两个有序数组B[0..P-1]和C[0..q-1]
 4 //输出:A[0..p+q-1]中已经有序存放了B和C中的元素
 5 i<-0;j<-0;k<-0
 6 while i<p and j<q do
 7     if B[i]<=C[j]
 8     else A[k]<-C[j];j<-j+1
 9     k<-k+1;
10     if i=p
11          copy C[j..q-1] to A[k..p+1-1]
12     else copy B[i..p-1] to A[k..p+q-1]

合并排序代码实现:

 1 result mergeSort(int *intArray,int n){
 2     if(intArray==NULL||n<0){
 3         return fail;
 4     }
 5     if(n==1){
 6         return success;
 7     }
 8     //分离
 9     int leftLength=n/2;
10     int rightLength=n-leftLength;
11 
12     int *leftArray=(int *)malloc(leftLength*sizeof(int *));
13     int *rightArray=(int *)malloc(rightLength*sizeof(int *));
14 
15     copy(intArray,leftArray,0,0,leftLength);
16     copy(intArray,rightArray,leftLength,0,rightLength);
17 
18 
19     //子数组排序
20     mergeSort(leftArray,leftLength);
21     mergeSort(rightArray,rightLength);
22 
23     //合并
24     merge(leftArray,rightArray,intArray,n);
25     return success;
26 }
27 
28 result merge(int *leftArray,int *rightArray,int *intArray,int n){
29     if(leftArray==NULL||rightArray==NULL||intArray==NULL||n<2){
30         return fail;
31     }
32     int leftLength=n/2;
33     int rightLength=n-leftLength;
34 
35     int leftIndex=0;
36     int rightIndex=0;
37     int intIndex=0;
38 
39     while(leftIndex<leftLength&&rightIndex<rightLength){
40         if(leftArray[leftIndex]<=rightArray[rightIndex]){
41             intArray[intIndex]=leftArray[leftIndex];
42             leftIndex++;
43         }else{
44             intArray[intIndex]=rightArray[rightIndex];
45             rightIndex++;
46         }
47         intIndex++;
48     }
49     if(leftIndex==leftLength){
50         copy(rightArray,intArray,rightIndex,intIndex,n-intIndex);
51     }else{
52         copy(leftArray,intArray,leftIndex,intIndex,n-intIndex);
53     }
54     return success;
55 }
56 
57 void copy(int *sourceArray,int *distArray,int sourceStart,int distStart,int length){
58     for(int i=0;i<length;i++){
59         distArray[distStart+i]=sourceArray[sourceStart+i];
60     }
61 }


完整代码:
合并排序第1张合并排序第2张View Code
 1 result mergeSort(int *intArray,int n){
 2      if(intArray==NULL||n<0){
 3          return fail;
 4      }
 5      if(n==1){
 6          return success;
 7      }
 8      //分离
 9      int leftLength=n/2;
10      int rightLength=n-leftLength;
11  
12      int *leftArray=(int *)malloc(leftLength*sizeof(int *));
13      int *rightArray=(int *)malloc(rightLength*sizeof(int *));
14  
15      copy(intArray,leftArray,0,0,leftLength);
16      copy(intArray,rightArray,leftLength,0,rightLength);
17  
18  
19      //子数组排序
20      mergeSort(leftArray,leftLength);
21      mergeSort(rightArray,rightLength);
22  
23      //合并
24      merge(leftArray,rightArray,intArray,n);
25      return success;
26  }
27  
28  result merge(int *leftArray,int *rightArray,int *intArray,int n){
29      if(leftArray==NULL||rightArray==NULL||intArray==NULL||n<2){
30          return fail;
31      }
32      int leftLength=n/2;
33      int rightLength=n-leftLength;
34  
35      int leftIndex=0;
36      int rightIndex=0;
37      int intIndex=0;
38  
39      while(leftIndex<leftLength&&rightIndex<rightLength){
40          if(leftArray[leftIndex]<=rightArray[rightIndex]){
41              intArray[intIndex]=leftArray[leftIndex];
42              leftIndex++;
43          }else{
44              intArray[intIndex]=rightArray[rightIndex];
45              rightIndex++;
46          }
47          intIndex++;
48      }
49      if(leftIndex==leftLength){
50          copy(rightArray,intArray,rightIndex,intIndex,n-intIndex);
51      }else{
52          copy(leftArray,intArray,leftIndex,intIndex,n-intIndex);
53      }
54      return success;
55  }
56  
57  void copy(int *sourceArray,int *distArray,int sourceStart,int distStart,int length){
58      for(int i=0;i<length;i++){
59          distArray[distStart+i]=sourceArray[sourceStart+i];
60      }
61  }

参考:算法设计与分析基础

免责声明:文章转载自《合并排序》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇OpenGL实践之--窗口创建图表展现技巧(多图)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

优化查找和排序

优化查找和排序 C++程序会进行许多查找操作。从编程语言的编译器到浏览器,从控制链表到数据库,许多反复进行的程序活动都会在某个内部的循环底层进行查找操作。就经验而言,查找操作通常会出现在热点函数的列表中。因此我们需要特别注意查找操作的效率。 使用std::map和std::string的键值对表 使用std::map创建表是一个例子,它向我们展示了C++标...

Python实现一些常用排序算法

一些常用的排序 #系统内置排序算法#list.sort()#heapq模块 def sys_heap_sort(list): import heapq heap = [] for i in range(len(list)): heapq.heappush(heap,list[i]) for i in rang...

对字符串进行快速排序(即字符数组排序)

package com.cn.gao; import java.util.Scanner; //对字符串进行快速排序 public class CharsQuickSort { public static final int SIZE=100; //可以输入的最大字符数 //快速排序的一次划分 public s...

图像检索(image retrieval)

Where to Focus: Query Adaptive Matching for Instance Retrieval Using Convolutional Feature Maps Abstract 实例检索要求在大型语料库中搜索包含特定对象的图像。最近的研究表明,使用预训练的卷积神经网络(CNN)的池化卷积层特征图(CFMs)生成的图像特征...

MySQL查询截取分析

一、查询优化 1,mysql的调优大纲 慢查询的开启并捕获 explain+慢SQL分析 show profile查询SQL在Mysql服务器里面的执行细节和生命周期情况 SQL数据库服务器的参数调优 2,小表驱动大表 mysql的join实现原理是,以驱动表的数据为基础,“嵌套循环”去被驱动表匹配记录。驱动表的索引会失效,而被驱动表的索引有效。 #假...

数据结构学习——shell排序的C语言实现

shell排序:   这个排序的命名是来自发明者的名字,和排序的方法没有字面上的联系。所以不要因为名字而感觉很难。在K&R的C程序设计语言中书中只用了几行代码很简洁的实现了这个排序算法。那就来看看这个排序是如何实现的。 原理:   我们将所要排序的序列(大小为n)划分成组,组的数量一般是可以用这个序列的大小的一半来定义(也就是d = n/2),然...