经典排序算法【转】
轉自?還有多少青春可以揮霍
?動畫圖解 :http://student.zjzk.cn/course_ware/data_structure/web/flashhtml/maopaopaixu.htm (更改后綴拼音)
?
/*冒泡排序算法的運作如下:1.比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。2.對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對。這步做完后,最后的元素會是最大的數。3.針對所有的元素重復以上的步驟,除了最后一個。4.持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。 */ public void BubbleSort<T>(T[] needSort) where T : IComparable{T temp;for (int i = 0; i < needSort.Length - 1; i++){for (int j = i + 1; j < needSort.Length; j++){if (needSort[i].CompareTo(needSort[j]) > 0){temp = needSort[i];needSort[i] = needSort[j];needSort[j] = temp;}}}} 冒泡排序 BubbleSort?
快速排序采用一種“分而治之、各個擊破”的觀念。 /*快速排序使用分治法(Divide and conquer)策略來把一個串行(list)分為兩個子串行(sub-lists)。步驟為:1.從數列中挑出一個元素,稱為 "基準"(pivot),2.重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的后面(相同的數可以到任一邊) 。在這個分區退出之后,該基準就處于數列的中間位置。這個稱為分區(partition)操作。3.遞歸地(recursive)把小于基準值元素的子數列和大于基準值元素的子數列排序。遞歸的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞歸下去,但是這個算法總會退出,因為在每次的迭代(iteration)中,它至少會把一個元素擺到它最后的位置去。舉個例子如無序數組[6 2 4 1 5 9]a),先把第一項[6]取出來,用[6]依次與其余項進行比較,如果比[6]小就放[6]前邊,2 4 1 5都比[6]小,所以全部放到[6]前邊如果比[6]大就放[6]后邊,9比[6]大,放到[6]后邊,//6出列后大喝一聲,比我小的站前邊,比我大的站后邊,行動吧!霸氣十足~一趟排完后變成下邊這樣:排序前 6 2 4 1 5 9排序后 5 2 4 1 6 9b),對前半拉[5 2 4 1]繼續進行快速排序重復步驟a)后變成下邊這樣:排序前 5 2 4 1排序后 1 2 4 5前半拉排序完成,總的排序也完成:排序前:[6 2 4 1 5 9]排序后:[1 2 4 5 6 9]排序結束以下代碼實現僅供參考 */public class Code{public void QuickSort<T>(T[] needSort, int low, int high) where T : IComparable{int targetPosition = 0;if (low < high){targetPosition = PositionArrange(needSort, low, high);QuickSort(needSort, low, targetPosition - 1);QuickSort(needSort, targetPosition + 1, high);}}public int PositionArrange<T>(T[] needSort, int low, int high) where T : IComparable{T tempData = needSort[low];while (low < high){while (low < high && needSort[high].CompareTo(tempData) > 0){high--;}needSort[low] = needSort[high];while (low < high && needSort[low].CompareTo(tempData) <= 0){low++;}needSort[high] = needSort[low];}needSort[low] = tempData;return low;}} 快速排序 quickSort?
使用插入排序為一列數字進行排序的過程 /* 一般來說,插入排序都采用in-place在數組上實現。具體算法描述如下:從第一個元素開始,該元素可以認為已經被排序 取出下一個元素,在已經排序的元素序列中從后向前掃描 如果該元素(已排序)大于新元素,將該元素移到下一位置 重復步驟3,直到找到已排序的元素小于或者等于新元素的位置 將新元素插入到該位置后 重復步驟2~5 如果比較操作的代價比交換操作大的話,可以采用二分查找法來減少比較操作的數目。該算法可以認為是插入排序的一個變種,稱為二分查找排序。 */public void InsertSort<T>(T[] needSort) where T : IComparable{for (int i = 1; i < needSort.Length; i++){T tempData = needSort[i];int j = i;while (j > 0 && needSort[j - 1].CompareTo(tempData) > 0){needSort[j] = needSort[j - 1];j--;}needSort[j] = tempData;//for (int j = 0; j < i; j++)//{// if (needSort[i].CompareTo(needSort[j]) < 0)// {// T tempData = needSort[i];// needSort[i] = needSort[j];// needSort[j] = tempData;// }//} }} 插入排序 insertSort?
/*算法描述歸并操作的過程如下:申請空間,使其大小為兩個已經排序串行之和,該空間用來存放合并后的串行設定兩個指針,最初位置分別為兩個已經排序串行的起始位置比較兩個指針所指向的元素,選擇相對小的元素放入到合并空間,并移動指針到下一位置重復步驟3直到某一指針到達串行尾將另一串行剩下的所有元素直接復制到合并串行尾 */ public class CodeSample{public void DataMerge<T>(T[] needSort, int low, int middle, int high, T[] temp) where T : IComparable{Console.WriteLine("low:{0} middle:{1} high:{2}", low, middle, high);foreach (T t in needSort){Console.Write(t + " ");}Console.WriteLine();Console.WriteLine("---------------");int i = low, j = middle;int k = 0;while (i < middle && j < high){if (needSort[i].CompareTo(needSort[j]) < 0){temp[k++] = needSort[i++];}else{temp[k++] = needSort[j++];}}while (i < middle){temp[k++] = needSort[i++];}while (j < high){temp[k++] = needSort[j++];}for (int v = 0; v < k; v++){needSort[low + v] = temp[v];}}public void MergeSort<T>(T[] needSort, int low, int high, T[] temp) where T : IComparable{if (low + 1 < high){int middle = (low + high) / 2;MergeSort(needSort, low, middle, temp);MergeSort(needSort, middle, high, temp);DataMerge(needSort, low, middle, high, temp);}}}/*測試數據:int[] needSort = { 11, 5, 26, 9, 11, 8, 3, 2, 1 };輸出low:0 middle:1 high:211 5 26 9 11 8 3 2 1---------------low:2 middle:3 high:45 11 26 9 11 8 3 2 1---------------low:0 middle:2 high:45 11 9 26 11 8 3 2 1---------------low:4 middle:5 high:65 9 11 26 11 8 3 2 1---------------low:7 middle:8 high:95 9 11 26 8 11 3 2 1---------------low:6 middle:7 high:95 9 11 26 8 11 3 1 2---------------low:4 middle:6 high:95 9 11 26 8 11 1 2 3---------------low:0 middle:4 high:95 9 11 26 1 2 3 8 11---------------1 2 3 5 8 9 11 11 26請按任意鍵繼續. . . */ 歸并排序 MergeSort?
經典排序算法 - 桶排序Bucket sort
經典排序算法 - 基數排序Radix sort
經典排序算法 - 鴿巢排序Pigeonhole sort
經典排序算法 - 歸并排序Merge sort
經典排序算法 - 冒泡排序Bubble sort
經典排序算法 - 選擇排序Selection sort
經典排序算法 - 雞尾酒排序Cocktail sort
經典排序算法 - 希爾排序Shell sort
經典排序算法 - 堆排序Heap sort序
經典排序算法 - 地精排序Gnome Sort
經典排序算法 - 奇偶排序Odd-even sort
經典排序算法 - 梳排序Comb sort
經典排序算法 - 耐心排序Patience Sorting
經典排序算法 - 珠排序Bead Sort
經典排序算法 - 計數排序Counting sort
新增
經典排序算法 - Proxmap Sort
經典排序算法 - Flash Sort
經典排序算法 - Strand Sort
經典排序算法 - 圈排序Cycle Sort
經典排序算法 - 圖書館排序(Library Sort)
?
轉載于:https://www.cnblogs.com/wipphj/p/3912787.html
總結
- 上一篇: js获取checkbox复选框获取选中的
- 下一篇: http压力测试工具