国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++實現自底向上的歸并排序算法

2020-02-24 14:28:39
字體:
來源:轉載
供稿:網友

在計算機中合并排序是一種有效的、通用的、基于比較的排序算法,大多數都可以實現產生穩定的排序,這意味著排序輸出中等價元素的輸入順序是保持不變的,那么C++實現自底向上的歸并排序算法大家清楚嗎?武林技術頻道帶你了解。

一. 算法描述

自底向上的歸并排序:歸并排序主要是完成將若干個有序子序列合并成一個完整的有序子序列;自底向上的排序是歸并排序的一種實現方式,將一個無序的N長數組切個成N個有序子序列,然后再兩兩合并,然后再將合并后的N/2(或者N/2 + 1)個子序列繼續進行兩兩合并,以此類推得到一個完整的有序數組。下圖詳細的分解了自底向上的合并算法的實現過程:

二. 算法實現

/*=============================================================================##   FileName:  mergeSort.c#   Algorithm: 歸并排序(自底向上)#   Author:   Knife#   Created:  2014-06-14 16:40:02#=============================================================================*/#include<stdio.h>#include<stdlib.h>void merge_sort(int* intArr, int intArr_len);void merge_array(int* intArr1, int len1, int* intArr2, int len2);void main(){  int intArr[] = {8,3,6,4,2,9,5,4,1,7};  int n = sizeof (intArr) / sizeof (intArr[0]);  int i = 0;  merge_sort(intArr, n);  for(;i<n;i++){    printf("%d ",intArr[i]);  }  printf("/n");}//歸并排序(自底向上)void merge_sort(int* intArr, int intArr_len){  int len = 1;  int k = 0;  while (len < intArr_len) {     int i = 0;     for (; i + 2*len <= intArr_len; i += 2*len){      int* intArr1 = intArr + i;      int intArr1_len = len;      int* intArr2 = intArr + i + len;      int intArr2_len = len;      merge_array(intArr1, intArr1_len, intArr2, intArr2_len);     }    if (i + len <= intArr_len){       int* intArr1 = intArr + i;      int intArr1_len = len;      int* intArr2 = intArr + i + len;      int intArr2_len = intArr_len - i - len;      merge_array( intArr1, intArr1_len, intArr2, intArr2_len);     }    len *= 2;  //有序子序列長度*2   } }//合并兩個數組,并排序void merge_array(int* intArr1, int len1, int* intArr2, int len2){  //申請分配空間  int* list = (int*) malloc((len1+len2) * sizeof (int));  int i = 0, j = 0, k = 0;  while(i < len1 && j < len2){     // 把較小的那個數據放到結果數組里, 同時移動指針    list[k++] = (intArr1[i] < intArr2[j]) ? intArr1[i++] : intArr2[j++];  }  // 如果 intArr1 還有元素,把剩下的數據直接放到結果數組  while(i < len1){    list[k++] = intArr1[i++];  }  // 如果 intArr2 還有元素,把剩下的數據直接放到結果數組  while(j < len2){    list[k++] = intArr2[j++];  }   // 把結果數組 copy 到 intArr1 里  for(i = 0; i < k; i++){    intArr1[i] = list[i];  }  //釋放申請的空間  free(list);}

三. 算法分析

平均時間復雜度:O(nlog2n)
空間復雜度:O(n)? (用于存儲有序子序列合并后有序序列)
穩定性:穩定

我們在學習這方面知識之前,是否了解清楚C++實現自底向上的歸并排序算法呢?如果你有其他問題,可以咨詢武林技術頻道,小編盡自己所能為你解惑。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 沁水县| 谷城县| 桂平市| 宁安市| 页游| 南丰县| 威宁| 兴海县| 嘉鱼县| 民和| 北宁市| 上犹县| 海原县| 屏东县| 华阴市| 威信县| 邻水| 固阳县| 霸州市| 息烽县| 洛宁县| 日土县| 大余县| 荆州市| 伊宁县| 本溪市| 瓦房店市| 牡丹江市| 灵宝市| 菏泽市| 呈贡县| 天柱县| 松潘县| 南康市| 同心县| 通榆县| 马关县| 甘肃省| 石家庄市| 辛集市| 海林市|