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

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

C++實(shí)現(xiàn)自頂向下的歸并排序算法

2020-05-23 14:11:40
字體:
供稿:網(wǎng)友
這篇文章主要介紹了C++實(shí)現(xiàn)自頂向下的歸并排序算法,結(jié)合實(shí)例詳細(xì)分析了自頂向下的歸并排序算法的原理與具體實(shí)現(xiàn)步驟,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
 

本文實(shí)例講述了C++實(shí)現(xiàn)自頂向下的歸并排序算法。分享給大家供大家參考,具體如下:

一. 算法描述

自頂向下的歸并排序:采用分治法進(jìn)行自頂向下的程序設(shè)計(jì)方式,分治法的核心思想就是分解、求解、合并。

1. 先將長(zhǎng)度為N的無序序列分割平均分割為兩段
2. 然后分別對(duì)前半段進(jìn)行歸并排序、后半段進(jìn)行歸并排序
3. 最后再將排序好的前半段和后半段歸并

過程(2)中進(jìn)行遞歸求解,最終下圖詳細(xì)的分解了自頂向下的合并算法的實(shí)現(xiàn)過程:

C++實(shí)現(xiàn)自頂向下的歸并排序算法

二. 算法實(shí)現(xiàn)

/*=============================================================================##   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){  if(intArr_len > 1){    int* intArr1 = intArr;    int intArr1_len = intArr_len/2;    int* intArr2 = intArr + intArr_len/2;    int intArr2_len = intArr_len - intArr1_len;    //分別歸并排序    merge_sort(intArr1,intArr1_len);    merge_sort(intArr2,intArr2_len);    //排序    merge_array(intArr1, intArr1_len, intArr2, intArr2_len);  }}//合并兩個(gè)數(shù)組,并排序void merge_array(int* intArr1, int len1, int* intArr2, int len2){  //申請(qǐng)分配空間  int* list = (int*) malloc((len1+len2) * sizeof (int));  int i = 0, j = 0, k = 0;  while(i < len1 && j < len2){     // 把較小的那個(gè)數(shù)據(jù)放到結(jié)果數(shù)組里, 同時(shí)移動(dòng)指針    list[k++] = (intArr1[i] < intArr2[j]) ? intArr1[i++] : intArr2[j++];  }  // 如果 intArr1 還有元素,把剩下的數(shù)據(jù)直接放到結(jié)果數(shù)組  while(i < len1){    list[k++] = intArr1[i++];  }  // 如果 intArr2 還有元素,把剩下的數(shù)據(jù)直接放到結(jié)果數(shù)組  while(j < len2){    list[k++] = intArr2[j++];  }   // 把結(jié)果數(shù)組 copy 到 intArr1 里  for(i = 0; i < k; i++){    intArr1[i] = list[i];  }  //釋放申請(qǐng)的空間  free(list);}

三. 算法分析

平均時(shí)間復(fù)雜度:O(nlog2n)
空間復(fù)雜度:O(n)  (用于存儲(chǔ)有序子序列合并后有序序列)
穩(wěn)定性:穩(wěn)定

希望本文所述對(duì)大家C++程序設(shè)計(jì)有所幫助。



發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 景东| 封开县| 隆林| 泗水县| 云浮市| 金坛市| 凌源市| 和顺县| 新密市| 云林县| 永新县| 衡山县| 通城县| 尉犁县| 山东省| 通许县| 安丘市| 内江市| 商洛市| 开江县| 兴山县| 本溪市| 建阳市| 海口市| 鄄城县| 青冈县| 河东区| 金山区| 华池县| 满洲里市| 阿克陶县| 保靖县| 新丰县| 仁布县| 区。| 电白县| 德惠市| 西林县| 牡丹江市| 湄潭县| 武清区|