日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

归并排序(视频+详解+代码)

發布時間:2024/8/23 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 归并排序(视频+详解+代码) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

歸并排序

概述:歸并排序(MERGE-SORT)是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合并,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合并成一個有序表,稱為二路歸并

歸并過程為:比較a[i]a[j]的大小,若a[i]≤a[j],則將第一個有序表中的元素a[i]復制到r[k]中,并令ik分別加上1;否則將第二個有序表中的元素a[j]復制到r[k]中,并令jk分別加上1,如此循環下去,直到其中一個有序表取完,然后再將另一個有序表中剩余的元素復制到r中從下標k到下標t的單元。歸并排序的算法我們通常用遞歸實現,先把待排序區間[s,t]以中點二分,接著把左邊子區間排序,再把右邊子區間排序,最后把左區間和右區間用一次歸并操作合并成有序的區間[s,t]

歸并操作

?

歸并操作(merge),也叫歸并算法,指的是將兩個順序序列合并成一個順序序列的方法。

如 設有數列{62021003013881}

初始狀態:6,202,100,301,38,81

第一次歸并后:{6,202},{100,301},{8,38},{1},比較次數:3

第二次歸并后:{6,100,202,301}{1,8,38},比較次數:4

第三次歸并后:{1,6,8,38,100,202,301},比較次數:4

總的比較次數為:3+4+4=11,

逆序數為14

算法描述

歸并操作的工作原理如下:

第一步:申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合并后的序列

第二步:設定兩個指針,最初位置分別為兩個已經排序序列的起始位置

第三步:比較兩個指針所指向的元素,選擇相對小的元素放入到合并空間,并移動指針到下一位置

重復步驟3直到某一指針超出序列尾

將另一序列剩下的所有元素直接復制到合并序列尾

視頻學習:http://www.tudou.com/listplay/SaZl9xKGqDE/hFFCJz8mBDM.html

代碼:

#include<stdio.h> void merge_sort(int *a,int *b,int x,int y) {if(y-x>1){int m=x+(y-x)/2;//中間點的坐標 int p=x,q=m,i=x;merge_sort(a,b,x,m);merge_sort(a,b,m,y);while(p<=m||q<y){if(q>=y||(p<m&&a[p]<=a[q]))b[i++]=a[p++];//從左半數組復制到臨時空間else b[i++]=a[q++];// 從右半數組復制到臨時空間}for(i=x;i<y;i++)a[i]=b[i]; } } int main() {int b[100],a[100],n;scanf("%d",&n);for(int i=0;i<n;i++)scanf("%d",&a[i]);int mid=n/2;merge_sort(a,b,0,n); for(int i=0;i<n;i++)printf("%d ",a[i]);return 0; }

總結

以上是生活随笔為你收集整理的归并排序(视频+详解+代码)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。