日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

经典排序算法【转】

發(fā)布時(shí)間:2024/4/14 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 经典排序算法【转】 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)自?還有多少青春可以揮霍

?動(dòng)畫(huà)圖解 :http://student.zjzk.cn/course_ware/data_structure/web/flashhtml/maopaopaixu.htm (更改后綴拼音)


?

/*冒泡排序算法的運(yùn)作如下:1.比較相鄰的元素。如果第一個(gè)比第二個(gè)大,就交換他們兩個(gè)。2.對(duì)每一對(duì)相鄰元素作同樣的工作,從開(kāi)始第一對(duì)到結(jié)尾的最后一對(duì)。這步做完后,最后的元素會(huì)是最大的數(shù)。3.針對(duì)所有的元素重復(fù)以上的步驟,除了最后一個(gè)。4.持續(xù)每次對(duì)越來(lái)越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對(duì)數(shù)字需要比較。 */ 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

?

快速排序采用一種“分而治之、各個(gè)擊破”的觀念。 /*快速排序使用分治法(Divide and conquer)策略來(lái)把一個(gè)串行(list)分為兩個(gè)子串行(sub-lists)。步驟為:1.從數(shù)列中挑出一個(gè)元素,稱(chēng)為 "基準(zhǔn)"(pivot),2.重新排序數(shù)列,所有元素比基準(zhǔn)值小的擺放在基準(zhǔn)前面,所有元素比基準(zhǔn)值大的擺在基準(zhǔn)的后面(相同的數(shù)可以到任一邊) 。在這個(gè)分區(qū)退出之后,該基準(zhǔn)就處于數(shù)列的中間位置。這個(gè)稱(chēng)為分區(qū)(partition)操作。3.遞歸地(recursive)把小于基準(zhǔn)值元素的子數(shù)列和大于基準(zhǔn)值元素的子數(shù)列排序。遞歸的最底部情形,是數(shù)列的大小是零或一,也就是永遠(yuǎn)都已經(jīng)被排序好了。雖然一直遞歸下去,但是這個(gè)算法總會(huì)退出,因?yàn)樵诿看蔚牡?#xff08;iteration)中,它至少會(huì)把一個(gè)元素?cái)[到它最后的位置去。舉個(gè)例子如無(wú)序數(shù)組[6 2 4 1 5 9]a),先把第一項(xiàng)[6]取出來(lái),用[6]依次與其余項(xiàng)進(jìn)行比較,如果比[6]小就放[6]前邊,2 4 1 5都比[6]小,所以全部放到[6]前邊如果比[6]大就放[6]后邊,9比[6]大,放到[6]后邊,//6出列后大喝一聲,比我小的站前邊,比我大的站后邊,行動(dòng)吧!霸氣十足~一趟排完后變成下邊這樣:排序前 6 2 4 1 5 9排序后 5 2 4 1 6 9b),對(duì)前半拉[5 2 4 1]繼續(xù)進(jìn)行快速排序重復(fù)步驟a)后變成下邊這樣:排序前 5 2 4 1排序后 1 2 4 5前半拉排序完成,總的排序也完成:排序前:[6 2 4 1 5 9]排序后:[1 2 4 5 6 9]排序結(jié)束以下代碼實(shí)現(xiàn)僅供參考 */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

?

使用插入排序?yàn)橐涣袛?shù)字進(jìn)行排序的過(guò)程 /* 一般來(lái)說(shuō),插入排序都采用in-place在數(shù)組上實(shí)現(xiàn)。具體算法描述如下:從第一個(gè)元素開(kāi)始,該元素可以認(rèn)為已經(jīng)被排序 取出下一個(gè)元素,在已經(jīng)排序的元素序列中從后向前掃描 如果該元素(已排序)大于新元素,將該元素移到下一位置 重復(fù)步驟3,直到找到已排序的元素小于或者等于新元素的位置 將新元素插入到該位置后 重復(fù)步驟2~5 如果比較操作的代價(jià)比交換操作大的話,可以采用二分查找法來(lái)減少比較操作的數(shù)目。該算法可以認(rèn)為是插入排序的一個(gè)變種,稱(chēng)為二分查找排序。 */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

?

/*算法描述歸并操作的過(guò)程如下:申請(qǐng)空間,使其大小為兩個(gè)已經(jīng)排序串行之和,該空間用來(lái)存放合并后的串行設(shè)定兩個(gè)指針,最初位置分別為兩個(gè)已經(jīng)排序串行的起始位置比較兩個(gè)指針?biāo)赶虻脑?#xff0c;選擇相對(duì)小的元素放入到合并空間,并移動(dòng)指針到下一位置重復(fù)步驟3直到某一指針到達(dá)串行尾將另一串行剩下的所有元素直接復(fù)制到合并串行尾 */ 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);}}}/*測(cè)試數(shù)據(jù):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請(qǐng)按任意鍵繼續(xù). . . */ 歸并排序 MergeSort

?

經(jīng)典排序算法 - 桶排序Bucket sort

經(jīng)典排序算法 - 基數(shù)排序Radix sort

經(jīng)典排序算法 - 鴿巢排序Pigeonhole sort

經(jīng)典排序算法 - 歸并排序Merge sort

經(jīng)典排序算法 - 冒泡排序Bubble sort

經(jīng)典排序算法 - 選擇排序Selection sort

經(jīng)典排序算法 - 雞尾酒排序Cocktail sort

經(jīng)典排序算法 - 希爾排序Shell sort

經(jīng)典排序算法 - 堆排序Heap sort序

經(jīng)典排序算法 - 地精排序Gnome Sort

經(jīng)典排序算法 - 奇偶排序Odd-even sort

經(jīng)典排序算法 - 梳排序Comb sort

經(jīng)典排序算法 - 耐心排序Patience Sorting

經(jīng)典排序算法 - 珠排序Bead Sort

經(jīng)典排序算法 - 計(jì)數(shù)排序Counting sort

新增

經(jīng)典排序算法 - Proxmap Sort

經(jīng)典排序算法 - Flash Sort

經(jīng)典排序算法 - Strand Sort

經(jīng)典排序算法 - 圈排序Cycle Sort

經(jīng)典排序算法 - 圖書(shū)館排序(Library Sort)

?

轉(zhuǎn)載于:https://www.cnblogs.com/wipphj/p/3912787.html

總結(jié)

以上是生活随笔為你收集整理的经典排序算法【转】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。