1.選擇排序(氣泡排序)
公升序
用第乙個元素跟其他元素比較,如果該元素比其他元素,則交換,保證該元素是最小的。然後再用第二個元素跟後面其他的比較,保證第二個元素是除第乙個最小的。依次迴圈,直到整個陣列。
//////選擇排序
/// public
class
selection:basesort
public
static
void
sort(icomparable a)}}
//交換次數更少,內迴圈只交換索引,最後再交換值
//for (var i = 0; i < a.length; i++)
//
//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次比較。
缺點
優點
資料移動少。交換次數和陣列大小是線性的。
2.插入排序
把乙個元素插入乙個有序的陣列,右邊元素需要右移一位。
與選擇排序一樣,當前索引左邊的所有元素都是有序的,但它們的最終位置還不確定,為了給更小的元素騰出空間,它們可能會被移動。當索引達到最右端時,陣列排序就完成了。初始時,可以認為第乙個元素就是乙個有序的陣列。
和選擇排序不同的是,插入排序所需的時間取決於元素的初始順序。乙個對部分有序的陣列會比對隨機數組排序要快的多。
publicclass
insertion : basesort
}/** temp 儲存當前值
* 然後拿 temp 跟左邊的值挨個比較
* 如果temp小就將比較的值向右移一位,直到遇到比temp大的數或者到頭了
* 就將temp放到當前位置+1的地方
*///
int n = a.length;
//for (int i = 1; i < n; i++)
//
//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 都需要一次比較,然後每次交換對應著一次比較,這兩種比較之間可能存在交叉,所以是小於等於。
上面的插入排序演算法**,只要遇到比當前元素大的就交換。可以優化這一塊,上面注釋的**,可以減少陣列訪問次數。
插入排序執行時間大概是選擇排序的一半。
氣泡排序,選擇排序,插入排序
氣泡排序,選擇排序,插入排序 小規模的檔案以及基本有序的檔案,插入排序的效能比快速排序的效能更為有效一些,實際上,插入排序通常也做快速排序實現的一部分。1 氣泡排序 packagedatastrut public classbubblesort public voidinsert longvalue...
選擇排序 , 插入排序 , 氣泡排序
編寫 include void println int array,int len 列印給定長度的陣列 printf n void swap int array,int i,int j 交換陣列中兩個位置的元素 void selectionsort int array,int len o n n 對...
氣泡排序 插入排序 選擇排序
氣泡排序是每輪比較未排序部分,從第乙個元素開始找最值,比較相鄰數字,依次往後推移,最終將最值置於最右。假設有n個數,外迴圈迴圈n 1遍,內迴圈是n 1在減去當前是第幾次外迴圈。void bubble sort mytype a,int n n為陣列長度 插入排序是從第二個元素開始快取,然後向前比較,...