資料結構 排序演算法(一)之直接插入排序,氣泡排序

2021-08-26 16:13:32 字數 2224 閱讀 8546

排序演算法在面試中是常見的,尤其是(插入排序,氣泡排序和快速排序),就抽個時間再複習一下排序演算法吧

插入排序的基本方法是:每步將乙個待排序的記錄按其關鍵字的大小插入到前面已經排序的序列中的適當位置,直到每個記錄都插入完畢為止。

1:直接插入排序 這是一種最簡單的排序方法,它的基本思想是將待排序的記錄分成兩個部分,第乙個部分已經排好序,第二個部分未排序好。排序中,每次都是從第二個部分中取出一條記錄,將其插入到第乙個部分,並且讓它排好序。初始化時,任取一條記錄作為第乙個部分,而其他的資料作為第二個部分。然後隨著排序的進行,第乙個部分的資料會越來越多,第二部分越來越少。總有那麼一次,第二部分會變為0,而第一部分會包含所有的資料並且是有序的。

下面直接看排序過程圖:(本例是顯示從小到大的排序)

初始化:[98] 45 13 47 58 34 09 73

i=2 : [45 98]13 47 58 34 09 73

i=3 : [13 45 98]47 58 34 09 73

i=4 : [13 45 47 98]58 34 09 73

i=5 : [

13 45 475898

]34 09 73

i=6 :[

133445 475898

]09 73

i=7 :[09

133445 475898

] 73

i=8 :[09

133445 47587398]

下面用電腦程式去考慮直接插入排序:

private static void sort(int a, int n) }}

}這個排序演算法是穩定的,時間複雜度都是o(n^2)。從空間上面來看,它只需要記錄的輔助的空間,該demo是k。

2:下面就是氣泡排序,這個排序方法在面試中是非常常見的排序題目之一;

氣泡排序是屬於交換排序的範疇,類似於水泡從水中往上冒。具體的方法是:先將第乙個記錄的鍵值和第二個的鍵值相比較,如果a[0]>a[1],那麼進行交換。然後比較第二個和第三個的鍵值,依次進行類推直到a[n-2]和a[n-1]記錄進行比較完成,這個過程就可以形象的稱為冒泡。這樣一次冒泡之後,那麼最大的就是第n大的傳到第n個位置。然後對前面n-1個資料繼續冒泡。第n-1大的資料拍到n-1個位置,重複以上的過程,每次排好乙個資料,最多需要n-1次,就相當於把n個資料排序好

下面看舉例排序過程圖:(本例是顯示從小到大的排序)

第一趟冒泡的過程為:初始化資料為:98 45 13 47 58 34 09 73

[45 98] 13 47 58 34 09 73 //98和45比較,交換

45 [13 98] 47 58 34 09 73 //98和13比較,交換

45 13 [4798]58 34 09 73 //98和47比較,交換

45 13 47 [58 98] 34 09 73 //98和58比較,交換

45 13 47 58 [34 98] 09 73 //98和34比較,交換

45 13 47 58 34 [09 98] 73 //98和09比較,交換

45 13 47 58 34 09 [73 98] //98和73比較,交換

這樣最大的98被交換到最後,接下繼續進行冒泡,每趟的結果如下:

第二趟:13,45,47,34,9,58,73,98

第三趟: 13,45,34,9,47,58,73,98

第四趟:13,34,9,45,47,58,73,98

第五趟: 13,9,34,45,47,58,73,98

第六趟:9,13,34,45,47,58,73,98

第七趟:9,13,34,45,47,58,73,98

下面用電腦程式去考慮直接插入排序:

private static void bubble_sort(int a, int n)

}system.out.println("\n");

printf(a);}}

兩層巢狀,複雜度是o(n^2)

下面進行上面的冒泡演算法的改進,仔細分析上面的演算法,我們發現每次冒泡都是很機械的從頭比較到尾部,其實每次冒泡之後,後面的資料已經排序ok了,我們只要每次記錄一下已經排序好的終點,改變每次氣泡排序比較的終點,這樣效率會提高很多,尤其對於已經排序將近完成的記錄進行排序。

private static void bubble_sort_improve(int a, int n)

}k = kk;}}

這樣效率會提高一些,不過複雜度還是o(n^2)

好了今天就先複習一下直接插入排序和氣泡排序

資料結構之 直接插入排序

直接插入排序即是在要排序的陣列中,假設前n 1 n 2 個數已經是排好序的,現在要把第n個數插入到前n個已經排好序的陣列中,使得這n個數也變成有序的,如此反覆迴圈,使得要排序的陣列中的最後乙個元素也排好序。我們可以先假設第乙個數是排好序的,然後第二個數和第乙個數進行比較,如果第二個數比第乙個數大,那...

資料結構 直接插入排序

直接插入排序 include include typedef struct int elem int length sqlist void initsqlist sqlist l int i printf 請輸入元素個數 scanf d l length l elem int malloc size...

資料結構 直接插入排序

直接插入排序 將待插入子串行元素逐步插入到有序序列的執行過程。設有一待排序序列s 其中是有序的,是無序的,要把後面無需的元素,乙個乙個的插入到前面有序的集合中去。如下面的序列可以分為兩個子串行 和 初始序列 75 88 68 92 88 62 77 96 80 72 第一次排序 75 88 68 9...