氣泡排序,選擇排序和插入排序

2022-08-04 08:12:10 字數 1372 閱讀 2082

這兩天的《演算法》進入排序的學習後,遇到了一些問題,下面是我自己總結的理解:

氣泡排序:

兩兩相比較遍歷陣列不斷以兩兩交換的方式找到最值(最大或最小),再從迴圈中剔除該最值縮小遍歷範圍繼續一次從頭至尾的遍歷,迴圈很多次至最終排序完成。

選擇排序:

以乙個變數儲存下表索引,同氣泡排序一樣的兩兩相比較,但不交換,而是不斷用變數儲存極值(大或小)的索引,直至找到最值後與邊界元素外迴圈a.[i]交換,然後i自增剔除該最值縮小遍歷範圍繼續用該方法遍歷,迴圈很多次至最終排序完成。

插入排序:

以乙個陣列元素為標誌(演算法中一般從邊界開始),以乙個方向依次為反方向的相鄰元素相比較,若比較結果符合排序要求,則該標誌前進(外迴圈自增一),繼續按照方向與下乙個進行比較;若結果不符合排序要求,則進入內迴圈,找出的這個不符元素與相鄰元素交換後退,然後繼續後退與相鄰元素比較(再交換),直至後退至該元素的位置符合排序要求,然後退出內迴圈,外迴圈自增一標誌繼續前進。這樣的外迴圈一次遍歷之後,排序完成。如果陣列本身是部分有序的,那麼排序時間將大大減少。

總結:

選擇排序是氣泡排序的優化,雖然兩種比較次數是一樣的,但是選擇排序減少了交換次數,縮減了排序時間

插入排序相比上述排序,以精妙的演算法極大優化了比較次數,因此在《演算法》p160中定論:插入排序平均比選擇排序快一倍。但這並不是插入排序的最優解,在書中p158中有提到,因為內迴圈中,找到不符元素後,採用了氣泡排序的思想不斷交換,可以進一步進行優化,把比待插入值大的值均向後移動以為而不是操作待差值兩兩交換,最後存在兩個相同的值,該值是比待差值大的最接近的值,將待差值與上述值原位置值變為待差值完成插入,就能進一步縮減排序時間,如下:

交換式:

public

static

void insertsort(int

arr)

}system.out.println("第"+i+"輪插入");

system.out.println(arrays.tostring(arr));

}}

移位式:

public

static

void insertsort(int

arr)

//這裡我們判斷是否需要賦值

if(insertindex + 1 !=i)

system.out.println("第"+i+"輪插入");

system.out.println(arrays.tostring(arr));

}}

上述三種演算法都無法解決大型陣列問題,或者效能很差

氣泡排序 選擇排序和插入排序

氣泡排序 思路 將相鄰的兩個數比較,將較小的數調到前頭 有n個數就要進行n 1趟比較,第一次比較中要進行n 1次兩兩比較,在第j趟比較中,要進行n j次兩兩比較。依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即首先比較第1個和第2個數,將小數放前,大數放後。然後比較第2個數和第3個數,將小數放...

氣泡排序和插入排序,選擇排序

插入排序原理 對於未排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。插入排序核心 假設第乙個元素排好,之後的元素對排好的部分從後向前比較並逐一移動。選擇排序 按第乙個元素為基礎,遍歷所有元素,找出最小值,然後調換 公升序 include includevoid embed int a,in...

氣泡排序 選擇排序和插入排序

一 氣泡排序 依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即首先比較第1個和第2個數,將小數放前,大數放後。然後比較第2個數和第3個數,將小數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前,大數放後。重複以上過程,直至最終完成排序。氣泡排序是穩定的。演算法時間複雜度是o n 2 二...