<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
升序
用第一個元素跟其他元素比較,如果該元素比其他元素,則交換,保證該元素是最小的。然後再用第二個元素跟後面其他的比較,保證第二個元素是除第一個最小的。依次迴圈,直到整個陣列。
/// <summary> /// 選擇排序 /// </summary> public class Selection:BaseSort { public static long usedTimes = 0; public Selection() { } public static void Sort(IComparable[] a) { Stopwatch timer = new Stopwatch(); timer.Start(); for (var i = 0; i < a.Length; i++) { int minIndex = i; for (var j = i + 1; j < a.Length; j++) { if (Less(a[j], a[minIndex])) { Exch(a, j, minIndex); //minIndex = j; } } } //交換次數更少,內迴圈只交換索引,最後再交換值 //for (var i = 0; i < a.Length; i++) //{ // int minIndex = i; // for (var j = i + 1; j < a.Length; j++) // { // if (Less(a[j], a[minIndex])) // minIndex = j; // } // Exch(a, minIndex, i); //} timer.Stop(); usedTimes = timer.ElapsedMilliseconds; } }
該演演算法的內迴圈是拿當前元素跟其他元素比較,交換元素的程式碼寫在內迴圈之外,每次交換都能排定一個元素,因此交換總次數是 N 。所以演演算法的時間效率取決於比較的次數。
由程式碼可知,0 到 N-1 之間的任意 i 會進行一次交換和 N-1-i 次比較,所以總共有 N 次交換和(N-1)+ (N-2)+ ...+2+1 = N(N-1)/2 ~ N^2 / 2次比較。
缺點
為了找出最小元素需要掃描一遍陣列,但這並沒有為下一篇掃描陣列提供什麼資訊。排序一個有序的陣列或一個主鍵全部相同的陣列同樣需要和排序亂陣列一樣的時間。
優點
資料移動少。交換次數和陣列大小是線性的。
把一個元素插入一個有序的陣列,右邊元素需要右移一位。
與選擇排序一樣,當前索引左邊的所有元素都是有序的,但它們的最終位置還不確定,為了給更小的元素騰出空間,它們可能會被移動。當索引達到最右端時,陣列排序就完成了。初始時,可以認為第一個元素就是一個有序的陣列。
和選擇排序不同的是,插入排序所需的時間取決於元素的初始順序。一個對部分有序的陣列會比對亂陣列排序要快的多。
public class Insertion : BaseSort { public static long usedTimes = 0; public static void Sort(IComparable[] a) { Stopwatch timer = new Stopwatch(); timer.Start(); /* * 將當前位置的值與前一個比較,如果小就互換, * 然後用前一個位置的值繼續, * 直到遇到比它大的值,停止內迴圈、 * 相當於拿當前值跟左邊有序陣列依次比較,如果當前值小就交換,如果遇到比當前值大的元素就跳出內迴圈,說明已經找到合適的位置了。 */ for (var i = 0; i < a.Length; i++) { for (var j = i; j > 0 && Less(a[j], a[j - 1]); j--) { Exch(a, j, j - 1); } } /* * temp 儲存當前值 * 然後拿 temp 跟左邊的值挨個比較 * 如果temp小就將比較的值向右移一位,直到遇到比temp大的數或者到頭了 * 就將temp放到當前位置+1的地方 */ //int N = a.Length; //for (int i = 1; i < N; i++) //{ // IComparable temp = a[i]; // int j; // for (j = i - 1; j >= 0 && Less(temp, a[j]); j--) // { // a[j + 1] = a[j]; // } // a[j + 1] = temp; //} timer.Stop(); usedTimes = timer.ElapsedMilliseconds; } }
對於最壞情況下(逆序),插入排序需要 ~ N^2 / 2 次比較和 ~ N^2 / 2 次交換。因為每次迴圈都需要 i 次比較和交換 (1+2.....+N-1)* N 。
對於最好情況下(全部有序),插入排序需要 N-1 次比較和 0 次交換。因為有序,所以不需要交換,只需要每次迴圈比較。
對於隨機排列的陣列,平均情況下插入排序需要 ~ N^2 / 4 次比較和 ~ N^2 / 4 次交換。亂陣列在平均情況下每個元素都有可能移動半個陣列的長度。
插入排序比較的次數是交換的次數加上一個額外項,該項為 N 減去被插入的元素正好是已知的最小元素的次數。最好情況下(全部有序),每一個元素都是已知的最小元素,所以這一項為 N-1。
插入排序對於非亂陣列(部分有序)很有效。例如,有序陣列或主鍵全部相同的陣列,它的執行時間是線性的。
現在考慮一般的情況是部分有序的陣列。倒置指的是陣列中兩個順序顛倒的元素。比如 E X A M P L E 中有 11 對倒置:E-A, X-A, X-M, X-P, X-L, X-E, M-L, M-E, P-L, P-E, L-E 。如果陣列中倒置的數量小於陣列大小的某個倍數,這個陣列就是部分有序的。
下面是典型的部分有序的陣列:
陣列中每個元素距離它的最終位置都不遠;
一個有序的大陣列接一個小陣列;
陣列中只有幾個元素的位置不確定;
當倒置的數量很少時,插入排序可能比任何排序演演算法都快。
插入排序需要的交換次數和陣列中倒置的數量相同,每次交換相當於減少一對倒置。需要比較的次數大於等於倒置的數量,小於等於倒置的數量加上陣列的大小減一。因為 1 到 N-1 之間的每個 i 都需要一次比較,然後每次交換對應著一次比較,這兩種比較之間可能存在交叉,所以是小於等於。
上面的插入排序演演算法程式碼,只要遇到比當前元素大的就交換。可以優化這一塊,上面註釋的程式碼,可以減少陣列存取次數。
插入排序執行時間大概是選擇排序的一半。
到此這篇關於C#實現氣泡排序和插入排序演演算法的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45