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

2021-05-24 07:10:08 字數 4372 閱讀 1356

1. 氣泡排序

演算法介紹

氣泡排序,是指計算機的一種排序方法,它的時間複雜度為o(n^2),雖然不及堆排序、快速排序的o(nlogn,底數為2),但是有兩個優點:1.「編 程複雜度」很低,很容易寫出**;2.具有穩定性,這裡的穩定性是指原序列中相同元素的相對順序仍然保持到排序後的序列,而堆排序、快速排序均不具有穩定 性。不過,一路、二路歸併排序、不平衡二叉樹排序的速度均比氣泡排序快,且具有穩定性,但速度不及堆排序、快速排序。氣泡排序是經過n-1趟子排序完成 的,第i趟子排序從第1個數至第n-i個數,若第i個數比後乙個數大(則公升序,小則降序)則交換兩數。

基本概念

冒泡

排 序(bubblesort)的基本概念是:依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即在第一趟:首先比較第1個和第2個數,將小數放前,大 數放後。然後比較第2個數和第3個數,將小數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前,大數放後。至此第一趟結束,將最大的數放到了最 後。在第二趟:仍從第一對數開始比較(因為可能由於第2個數和第3個數的交換,使得第1個數不再小於第2個數),將小數放前,大數放後,一直比較到倒數第 二個數(倒數第一的位置上已經是最大的),第二趟結束,在倒數第二的位置上得到乙個新的最大數(其實在整個數列中是第二大的數)。如此下去,重複以上過 程,直至最終完成排序。

由於在排序過程中總是小數往前放,大數往後放,相當於氣泡往上公升,所以稱作氣泡排序。 用

二重迴圈

實 現,外迴圈變數設為i,內迴圈變數設為j。外迴圈重複9次,內迴圈依次重複9,8,...,1次。每次進行比較的兩個元素都是與內迴圈j有關的,它們可以 分別用a[j]和a[j+1]標識,i的值依次為1,2,...,9,對於每乙個i, j的值依次為1,2,...10-i。

設想被排序的陣列r[1..n]垂直豎立,將每個資料元素看作有重量的氣泡,根據輕氣泡不能在重氣泡之下的原則,從下往上掃瞄陣列r,凡掃瞄到違反本原則的輕氣泡,就使其向上"漂浮",如此反覆進行,直至最後任何兩個氣泡都是輕者在上,重者在下為止。

49 13 13 13 13 13 13 13

38 49 27 27 27 27 27 27

65 38 49 38 38 38 38 38

97 65 38 49 49 49 49 49

76 97 65 49 49 49 49 49

13 76 97 65 65 65 65 65

27 27 76 97 76 76 76 76

49 49 49 76 97 97 97 97

實現**(c#)

private

static

void swap(ref

int left, ref

int right)

private

static

void bubblesort(int r, int len)

} if (!flag)

} }

2. 選擇排序

演算法介紹

n個記錄的檔案的直接選擇排序可經過n-1趟直接選擇排序得到有序結果:

①初始狀態:無序區為r[1..n],有序區為空。

②第1趟排序

在無序區r[1..n]中選出關鍵字最小的記錄r[k],將它與無序區的第1個記錄r[1]交換,使r[1..1]和r[2..n]分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區。

…… ③第i趟排序

第i趟排序開始時,當前有序區和無序區分別為r[1..i-1]和r (1≤i≤n-1)。該趟排序從當前無序區中選出關鍵字最小的記錄 r[k],將它與無序區的第1個記錄r交換,使r[1..i]和r分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區。

這樣,n個記錄的檔案的直接選擇排序可經過n-1趟直接選擇排序得到有序結果。

常見的選擇排序細分為簡單選擇排序、樹形選擇排序(錦標賽 排序)、堆排序。上述演算法僅是簡單選擇排序的步驟。

演算法例項

初始關鍵字 [49 38 65 97 76 13 27 49]

第一趟排序後 13 [38 65 97 76 49 27 49]

第二趟排序後 13 27 [65 97 76 49 38 49]

第三趟排序後 13 27 38 [97 76 49 65 49]

第四趟排序後 13 27 38 49 [76 97 65 49 ]

第五趟排序後 13 27 38 49 49 [97 65 76]

第六趟排序後 13 27 38 49 49 65 [97 76]

第七趟排序後 13 27 38 49 49 65 76 [97]

最後排序結果 13 27 38 49 49 65 76 97

實現**(c#)

private

static

void swap(ref

int left, ref

int right)

private

static

void selectsort(int r, int len)

}swap(ref r[i], ref r[min]); }

}3. 插入排序

演算法介紹

有乙個已經有序的資料序列,要求在這個已經排好的資料序列中插入乙個數,但要求插入後此資料序列仍然有序,這個時候就要用到一種新的排序方法——插入排序法 ,插入排序的基本操作就是將乙個資料插入到已經排好序的有序資料中,從而得到乙個新的、個數加一的有序資料,演算法適用於少量資料的排序,時間複雜度為o(n^2)。是穩定的排序方法。插入演算法把要排序的陣列 分成兩部分:第一部分包含了這個陣列的所有元素,但將最後乙個元素除外,而第二部分就只包含這乙個元素。在第一部分排序後,再把這個最後元素插入到此刻已是有序的第一部分裡的位置。

基本概念

假定這個

陣列 的序是排好的,然後從頭往後,如果有數比當前外層元素的值大,則將這個數的位置往後挪,直到當前外層元素的值大於或等於它前面的位置為止.這具演算法在排完前k個數之後,可以保證a[1…k]是區域性有序的,保證了插入過程的正確性.

將n個元素的數列分為已有序和無序兩個部分,如

插入排序過程示例

下所示: }

,} …

, }

每次處理就是將無序數列的第乙個元素與有序數列的元素從後往前逐個進行比較,找出插入位置,將該元素

一般來說,插入排序都採用in-place在陣列上實現。具體演算法描述如下:

1. 從第乙個元素開始,該元素可以認為已經被排序

2. 取出下乙個元素,在已經排序的元素序列中從後向前掃瞄

3. 如果該元素(已排序)大於新元素,將該元素移到下一位置

4. 重複步驟3,直到找到已排序的元素小於或者等於新元素的位置

5. 將新元素插入到下一位置中

6. 重複步驟2

如果比較操作的代價比交換操作大的話,可以採用

二分查詢

法來減少比較操作的數目。該演算法可以認為是插入排序的乙個變種,稱為二分查詢排序。

實現**(c#)

private

static

void insertsort(int r, int len)

r[j + 1] = t; }

}

每一趟從待排序的資料元素中選出最小(或最大)的乙個元素,順序放在已排好序的數列的最後,直到全部待排序的資料元素排完。 選擇排序是不穩定的排序方法。

Java排序演算法之氣泡排序 插入排序 選擇排序

一 前言 排序是日常中最常見的一種演算法,常見的演算法有 氣泡排序 插入排序 選擇排序 歸併排序 快速排序 計數排序 快速排序 基數排序 桶排序。那麼該怎樣分析和學習排序演算法呢?二 演算法的分析課 在上述的八種排序方法中,根據時間複雜度和是否基於比較可以為三種 排序演算法 時間複雜度 是否基於比較...

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

public class sorts if flag 如果一輪排序中沒有發生交換證明已經排好 bubblesort的排序方法是保證每次確定把minimum value推到最前面 合適的位置 時間複雜度 o n2 return input public static int selectsort in...

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

package com.cc.mystudy.datastructor public class sortdemo for int i 0 i array.length i return array 選擇排序 將未排列陣列的起始位置設定為最小 大 值,將下標記錄下來 遍歷陣列,將其餘元素與第乙個元素...