1.歸併排序
分析:歸併排序使用分治思想,原理是
①將乙個無序數列分成兩個序列後,對序列進行排序後,再將兩個有序序列合併成乙個有序序列;
②分開的兩個序列又可以進行再分排序然後合併從而形成問題的子問題。
#include #include void merge(int *a, int *ans, int s, int m, int t)
for(; ak<=m; ak++)
for(; bk<=t; bk++)
}void mergesort(int *a, int n, int low, int high, int *ans)
mid = (low+high)/2;
//sort a[low...mid]
mergesort(a, n, low, mid, temp);
//sort a[mid+1, high]
mergesort(a, n, mid+1, high, temp);
//merge temp[low...mid] temp[mid+1, high] into ans[low...high]
merge(temp, ans, low, mid, high);
free(temp);
}int main(void);
int n = sizeof(data)/sizeof(int);
int ansk;
int *ans = (int*)malloc(sizeof(int)*n);
int *temp = (int*)malloc(sizeof(int)*n);
mergesort(data, n, 0, n-1, ans);
for(ansk=0; ansk2.堆排序
分析:①將無序數列視為一棵完全二叉樹的節點,並以層逐個加入樹中,樹的節點數/2的節點必有孩子;
②堆排序(結果需要從小到大排序)旨在將最大值元素移至樹根處,並將其與樹最後節點交換即可;
③對於乙個結點,需要滿足乙個條件a[i]>a[2*i]和a[i]>a[2*i+1];
④當乙個結點與其孩子交換後,需要對交換的孩子向下調整,保證滿足條件③;
所以堆排序的步驟則為:
1)由無序陣列視為一棵無安全二叉樹的節點,從擁有孩子的節點開始,先對該樹進行調整,使其滿足條件③,此時形成大頂堆;
2)樹根結點與樹最後節點交換後,由於已經形成大頂堆,所以第二大的元素必為根結點的孩子,所以只需要進行向下調整即可將最大元素置於根結點位置;假設第二大元素不為根結點孩子,那麼必然位於根結點孩子的左或右子樹,而由於第三個條件,子樹的根結點必為最大,所以必定不滿足條件③。
#include #include void swap(int *a, int *b)
void heapadjust(int *data, int n, int i) }}
void heapsort(int n, int *data)
int find_mid(int *d, int low, int high){
int k;
while(low
內部排序演算法
內部排序是指待排序列完全存放在記憶體中所進行的排序過程,適合不太大的元素序列。1.快速排序int partition int a,int low,int high a low a high while low2.並歸排序 void merging int list1,int list1 size,i...
內部排序演算法
內部排序演算法就是指記憶體中的排序演算法,而外部排序演算法則是指待排序資料過多,無法一次性載入到記憶體中,排序過程需要讀取磁碟,因此需要考慮磁碟 io 的消耗!內部排序演算法按照操作型別可大致分為五類 插入排序 交換排序 選擇排序 歸併排序 計數排序 內部排序演算法按照時間複雜度可大致分為三類 簡單...
內部排序演算法 選擇排序
選擇排序法可使用兩種方式排序 從小到大或從大到小 例如 當n個資料需要由大至小排序時,首先將第乙個位置的資料依次和第2 3 4 n個位置的資料進行比較。如果資料大於或等於其中乙個位置,則不變 若小於其中乙個位置的資料,則兩個位置的資料互換。互換後第1個位置的資料繼續與後續位置的資料進行比較,直到位置...