氣泡排序(選擇排序),插入排序

2022-07-04 13:00:10 字數 2362 閱讀 7674

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.插入排序

把乙個元素插入乙個有序的陣列,右邊元素需要右移一位。

與選擇排序一樣,當前索引左邊的所有元素都是有序的,但它們的最終位置還不確定,為了給更小的元素騰出空間,它們可能會被移動。當索引達到最右端時,陣列排序就完成了。初始時,可以認為第乙個元素就是乙個有序的陣列。

和選擇排序不同的是,插入排序所需的時間取決於元素的初始順序。乙個對部分有序的陣列會比對隨機數組排序要快的多。

public

class

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為陣列長度 插入排序是從第二個元素開始快取,然後向前比較,...