1 #include <iostream> 2 using namespace std; 3 /** 4 分治法: 5 合并排序最大的优点是它的时间复杂度为O(nlgn),这个是我们之前的选择排序和插入排序所达不到的。 6 他还是一种稳定性排序,也就是相等的元素在序列中的相对位置在排序前后不会发生变化。 7 他的唯一缺点是,需要利用额外的N的空间来进行排序。 8 9 实验步骤:: 10 申请空间,使其大小为两个已经排序序列之和,然后将待排序数组复制到该数组中。 11 设定两个指针,最初位置分别为两个已经排序序列的起始位置 12 比较复制数组中两个指针所指向的元素,选择相对小的元素放入到原始待排序数组中,并移动指针到下一位置 13 重复步骤3直到某一指针达到序列尾 14 将另一序列剩下的所有元素直接复制到原始数组末尾 15 16 */ 17 ///实现合并排序效果 18 template < class T> 19 void merge(T * arr, int low ,int mid, int heigh) 20 { 21 T * left =NULL,* right = NULL; ///两个指针用于指向两个分开数组 22 int i, j, k, len1 , len2; 23 len1 = mid - low +1; ///左侧数组长度 24 len2 = heigh - mid; ///右侧数组长度 25 26 ///动态分配内存 27 left = new T[len1]; 28 right = new T[len2]; 29 30 ///拆分数组 31 for( i = 0; i < len1; ++i) 32 left[i] = arr[low+i]; 33 for( j = 0 ; j < len2 ;++j) 34 right[j] = arr[mid+j+1]; 35 36 ///排序后合并 37 i = j = 0; 38 k = low; 39 while( i < len1 && j < len2) 40 { 41 if(left[i] <= right[j]) 42 arr[k++] = left[i++]; 43 else 44 arr[k++] = right[j++]; 45 } 46 ///处理剩余的未合并完的数据 47 for( ; i < len1 ;++i) ///如果左数组有元素剩余,则将剩余元素合并到arr数组 48 arr[k++] = left[i]; 49 for( ; j < len2;++j) ///如果右数组有元素剩余,则将剩余元素合并到arr数组 50 arr[k++] = right[j]; 51 } 52 53 template <typename T> 54 void mergeSort(T * arr , int low, int heigh) 55 { 56 int mid; 57 if(low < heigh) ///判定是否需要排序,只有一个或无记录时不须排序 58 { 59 mid = (int)(low + heigh)/2 ; ///将arr数组分为两半 60 mergeSort(arr, low, mid); 61 mergeSort(arr, mid+1, heigh); 62 merge(arr, low , mid , heigh); 63 } 64 } 65 66 int main() 67 { 68 int n; 69 int* input = NULL; 70 cout<<"请输入数组的长度: "; 71 cin>>n; 72 input = new int[n]; 73 cout<<"请对数组赋值: "; 74 for(int i=0; i<n; ++i) 75 { 76 cin>>input[i]; 77 } 78 //处理数据 79 mergeSort(input,0,n-1); 80 //输出结果 81 for(int i=0; i<n; ++i) 82 cout<<input[i]<<" "; 83 cout<<endl; 84 system("pause"); 85 return 0; 86 }
时间: 2024-10-11 03:32:20