【排序算法五】归并排序
2017-08-04 16:14
453 查看
归并排序
归并排序用到的思想是分治法,是分治法的典型应用。步骤:
(1) 将待排序的数据,划分为一个一个小区间
(2)将小区间归并成一个比较大的区间,临时存储到一个空间内,
(3)最后将临时空间的数据拷贝到原来的存储空间中。
时间复杂度
时间复杂度为O(N lgN),空间复杂度为O(N)
归并排序是稳定的算法
代码实现
//合并 void Merge(int arr1[],int left,int mid,int right,int temp[]); //拆分 void MSort(int arr1[], int left, int right, int temp[]); void MergeSort(int arr1[],size_t size) { int *temp = new int[size]; memset(temp, 0, sizeof(int)* size); MSort(arr1,0,size-1,temp); delete[] temp; } void MSort(int arr1[], int left, int right, int temp[]) // arr1归并排序后放在arr1[]中,temp作为一个辅助空间 { if (left < right) { int mid = left + ((right - left) >> 1); MSort(arr1, left, mid, temp); MSort(arr1, mid + 1, right, temp); Merge(arr1, left, mid, right, temp); //合并到temp中,再把temp 拷贝到arr1中 memcpy(arr1+left, temp+left, sizeof(arr1[0])*(right - left + 1)); //注意这里加left,不然破坏原来的数组,并且不能正常拷贝 } } //合并 void Merge(int arr1[],int left,int mid,int right,int temp[]) //升序 // 相邻两个有序子序列的合并算法,arr1[low ,mid] 和arr1[mid+1,hight] 合并成有序,存放到temp中 { int i = left; //控制左半部分 int j = mid + 1; //控制右半部分 int k = left;//arr2的下标 ,注意不可以是0, while (i <= mid && j <= right) { if (arr1[i] <= arr1[j]) { temp[k++] = arr1[i++]; } else { temp[k++] = arr1[j++]; } } //跳出循环可能有剩余的有序 while (i <= mid) { temp[k++] = arr1[i++]; } while (j <= right) { temp[k++] = arr1[j++]; } }
非递归算法
看图直接看明白
非递归思想: 将数组中的相邻元素两两配对,用merge函数将他们排序, 构成n / 2组长度为2的排序好的子数组段,然后再将他们排序成长度为4的子数组段,如此继续下去,直至整个数组排好序。
void MergeSortNor(int arr[],size_t size) { int *temp = new int[size]; size_t left = 0; size_t right = size - 1; size_t gap = 1; while (gap < size) { for (size_t idx = 0; idx < size;idx += gap*2) { left = idx; size_t mid = left + gap - 1; right = mid + gap; if (mid >= size) //最后一次排序 mid = size - 1; if (right >= size) //第二个序列不足, right = size - 1; Merge(arr,left,mid,right,temp); cout << left << " " << mid << " " << right << endl; } memcpy(arr,temp,sizeof(arr[0])*size); gap <<= 1; } }
相关文章推荐
- 【自考】排序算法-插入、交换、选择、归并排序
- 归并排序(Merging Sort)----(排序算法十三)
- 排序算法代码---归并排序
- 排序算法java 二 --基数排序、归并排序
- 高级排序算法之-归并排序(MERGESORT)
- 归并排序----排序算法
- 排序算法之归并排序
- 排序算法(二)_希尔排序、快速排序、归并排序的Java实现
- 各种排序算法的实现-10(归并排序的实现)
- 知识点11:常见的排序算法–归并排序
- 排序算法之归并排序
- 【转】排序算法复习(Java实现) (二): 归并排序,堆排序,桶式排序,基数排序
- 排序算法二之快速 归并排序
- 排序算法之归并排序(JAVA)
- C++编程练习(15)----“排序算法 之 归并排序“
- 排序算法之归并排序
- 排序算法总结之归并排序
- 排序算法--归并排序(merge)
- 【排序算法】归并排序
- Java实现排序算法——归并排序