您好,登錄后才能下訂單哦!
這篇文章主要介紹“Java歸并排序方法怎么使用”,在日常操作中,相信很多人在Java歸并排序方法怎么使用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java歸并排序方法怎么使用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
題目 用歸并排序法對一組數據由小到大進行排序,數據分別為695、458、362、789、12、15、163、23、2、986。
1、程序分析
歸并過程為:比較a[i]和a[j]的大小,若a[i]≤a[j],則將第一個有序表中的元素a[i]復制到r[k]中,并令i和k分別加上1;否則將第二個有序表中的元素a[j]復制到r[k]中,并令j和k分別加上1,如此循環下去,直到其中一個有序表取完,然后再將另一個有序表中剩余的元素復制到r中從下標k到下標t的單元。歸并排序的算法我們通常用遞歸實現,先把待排序區間[s,t]以中點二分,接著把左邊子區間排序,再把右邊子區間排序,最后把左區間和右區間用一次歸并操作合并成有序的區間[s,t]。
歸并是將兩個或多個有序記錄序列合并成一個有序序列。歸并方法有很多種,一次對兩個有序記錄進行歸并,稱為二路歸并排序,也有三路歸并排序及多路歸并排序。本例程采用二路歸并排序,基本方法如下:
a、將n個記錄看成n個長度為1的有序子表。
b、將兩兩相鄰的有序子表進行歸并。
c、重復執行b,直到歸并成一個長度為n的有序表。
2、程序實現
/****************************************************************** * Topic : 用歸并排序法對一組數據由小到大進行排序,數據分別為 * 695、458、362、789、12、15、163、23、2、986 * File Name : MergeSort * Author : Jack Cui * Created : 4 April 2016 * ****************************************************************/#include <stdio.h>/*歸并排序函數聲明*/void MergeSort(int iSourceArr[],int iTempArr[],int iStartIndex,int iEndIndex);void Merge(int iSourceArr[],int iTempArr[],int iStartIndex,int iMidIndex,int iEndIndex);int main(void) {int i,iArr_b[10],iArr_a[10]; printf("請輸入10個數:\n");for(i = 0;i < 10;i++) scanf("%d",&iArr_a[i]); MergeSort(iArr_a,iArr_b,0,9); printf("快速排序后的順序為:\n");for(i = 0;i < 10;i++) printf("%5d",iArr_a[i]); printf("\n");return 0; }/********************************** *函數名稱:MergeSort *參數說明:iSourceArr[] 原始數組 * iTempArr[] 臨時數組 * iStartIndex 起始位置索引值 * iEndIndex 結束位置索引值 *說明: 二路歸并排序 ***********************************/void MergeSort(int iSourceArr[],int iTempArr[],int iStartIndex,int iEndIndex) {int iMidIndex;if(iStartIndex < iEndIndex) { iMidIndex = (iStartIndex + iEndIndex) / 2;/*遞歸調用將iSourceArr[iStartIndex]~iSourceArr[iMidIndex]歸并成有序的*/MergeSort(iSourceArr,iTempArr,iStartIndex,iMidIndex);/*遞歸調用將iSourceArr[iMidIndex+1]~iSourceArr[iEndIndex]歸并成有序的*/MergeSort(iSourceArr,iTempArr,iMidIndex+1,iEndIndex);/*調用函數將前兩部分歸并到iSourceArr[iStartIndex]~iSourceArr[iEndIndex]*/Merge(iSourceArr,iTempArr,iStartIndex,iMidIndex,iEndIndex); } }/********************************** *函數名稱:Merge *參數說明:iSourceArr[] 原始數組 * iTempArr[] 臨時數組 * iStartIndex 起始位置索引值 * iMidIndex 中間位置索引值 * iEndIndex 結束位置索引值 *說明: 歸并排序 ***********************************/void Merge(int iSourceArr[],int iTempArr[],int iStartIndex,int iMidIndex,int iEndIndex) {int i = iStartIndex,j = iMidIndex + 1,k = iStartIndex;while((i <= iMidIndex) && (j <= iEndIndex)) //當i和j都在要合并的部分中成立{if(iSourceArr[i] >= iSourceArr[j]) iTempArr[k++] = iSourceArr[j++];elseiTempArr[k++] = iSourceArr[i++]; }while(i <= iMidIndex) //將iStartIndex~iMidIndex內,未比較的數組順次加到iTempArr數組中iTempArr[k++] = iSourceArr[i++];while(j <= iEndIndex) //將iMidIndex+1~iStartIndex內,未比較的數組順次加到iTempArr數組中iTempArr[k++] = iSourceArr[j++];for(i = iStartIndex; i <= iEndIndex; i++) iSourceArr[i] = iTempArr[i]; }
3、結果顯示
到此,關于“Java歸并排序方法怎么使用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。