1. 歸併排序
將待排序序列分成兩個長度相同的子串行,對每個子串行進行排序,直至子串行剩餘乙個數,在將其合併成乙個序列
具體步驟:
分組:將待排序序列一分為2,在將子串行進行劃分,直至子串行只有乙個元素
歸併:將每個子串行進行排序,將排好序的兩個子串行進行合併
演算法分析
**
void merge(datatype* a, int left, int mid, int right)
else
}//陣列1中還有資料
if (begin1 <= end1)
}//陣列2中還有資料
if (begin2 <= end2)
}//將臨時陣列的資料拷回原陣列
index = 0;
while (index
< right - left + 1)
free(tmp);
}//歸併排序
void mergesort(datatype* a, int left, int right)
else
}
2.計數排序計數排序又稱為鴿巢原理,是對雜湊直接定址法的變形應用
具體步驟:
遍歷陣列,統計待排序陣列的範圍range
開闢陣列,大小為統計的範圍,並初始化為0
遍歷陣列,統計每個數出現的次數
將統計好陣列元素出現的次數儲存在雜湊表對應位置上,對應位置即為陣列元素大小
注意:待排序陣列中不能有負數
演算法分析
**
//計數排序
void countsort(datatype* a, size_t n)
if (a[i]>max)
}size_t range = max - min + 1;
//開闢範圍大小的陣列
datatype* count = (datatype*)malloc(sizeof(int)*range);
assert(count);
memset(count, 0, sizeof(int)*range);
//統計每個數出現的次數
for (size_t index = 0; index
< n; ++index)
//將數字拷至原陣列中
size_t index = 0;
for (size_t i = 0; i < range; ++i)
}free(count);
}
演算法筆記 歸併排序 快速排序 計數排序
public static void mergesort int a public static void mergesort int a,int start,int end 取中點 int mid start end start 2 遞迴排序左半部分 mergesort a,start,mid 遞...
四 歸併排序 非比較排序 歸併排序 計數排序
基本思想 歸併排序 merge sort 是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列 即先使每個子串行有 序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。歸...
排序演算法 歸併排序
歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。首先考慮下如何將將二個有序數列合併。這個非常簡單,只要從比較二個數列的第乙個數,誰小就先取誰,取了後就在對應數列中刪除這個數。然後再進行比較,如果有數列為空,那直接將另...