- 歸併排序(merge sort)
依舊先上源**
#include
#include
void merge(int sourcearr,int temparr, int startindex, int midindex, int endindex)
while(i != midindex+1)
temparr[k++] = sourcearr[i++];
while(j != endindex+1)
temparr[k++] = sourcearr[j++];
for(i=startindex; i<=endindex; i++)
sourcearr[i] = temparr[i];
}void mergesort(int sourcearr, int temparr, int startindex, int endindex)
}int main(int argc, char * argv)
; int i, b[8];
mergesort(a, b, 0, 7);
for(i=0; i<8; i++)
printf("%d ", a[i]);
printf("\n");
return
0;}
對於歸併排序,我們可以把一列數排序,也可以把好多列數排序。
歸併其實就是把這些數乙個個分開,然後在一組組的有序的合併起來。
先講需要的變數
int sourcearr
這個陣列用來存放排好序的數字們,
int temparr
這個陣列用來暫時存放資料,
int startindex, int midindex, int endindex
這個是開始,中點,終點;
midindex = (startindex + endindex) / 2;
找到中點,然後一分為二,直到分成乙個乙個的,這時候第一階段就算是完成了;
接下來是第二階段,排序開始。
while(i!=midindex+1 && j!=endindex+1)
while(i != midindex+1)
i 代表著前一塊的數值下標,j 代表後面一段的下標
對於前後這兩段的數值們,都先將指標放在第乙個數值那裡,然後,如果前面的大於後面的,就先將它放入temp陣列裡,暫時存一下,然後指標向後挪乙個,以此類推,直至一方指標走到底,結束了第一段。
此時,其中一段會有剩餘,接下來就將這段剩餘一起放入temp陣列。
這樣,這兩段就排好大小了,再把排好的放到source陣列裡存好。
一步步,直到最後排好。
這個樣子,歸併就結束了,來乙個示意圖:
好了,這個也結束了…
排序 排序演算法2
思想 堆,堆頂元素 即第乙個元素 必為最小項 小頂堆 公升序序列 或者最大項 大頂堆 降序序列 若以一維陣列儲存乙個堆,則堆對應一棵完全二叉樹,且所有非葉結點的值均不大於 或不小於 其子女的值,根結點 堆頂元素 的值是最小 或最大 的。雖然說是一棵完全二叉樹,但不是說就得根據這些資料還需要重新建立資...
排序演算法2
這是 漫談經典排序演算法系列 第二篇,解析了各種插入排序演算法 主要包括 直接插入排序 折半插入排序 表插入排序 希爾插入排序。每一種演算法的開頭都敘述了引出該演算法的原因,然後給出 最後分析演算法效率及和其他插入排序相比,優劣在 各種排序演算法的解析請參考如下 漫談經典排序演算法 一 從簡單選擇排...
排序演算法 2
快速排序 quicksort 演示 現在左側是比70小的數,右側是比70大的數。繼續以左側陣列為例解釋,基準位歸位 while i j 1 arr begin arr j arr j tmp quick sort arr,begin,j 1 quick sort arr,j 1,end public...