排序演算法 冒泡 插入 選擇排序

2021-09-29 20:43:58 字數 3927 閱讀 4191

分析排序演算法從下列3個方面進行:

排序演算法執行效率 :時間複雜度

(1)最好情況下時間複雜度

(2)最壞情況下時間複雜度

(3)平均情況時間複雜度

排序演算法記憶體消耗 :空間複雜度,其中原地排序特指空間複雜度為o(1)的排序演算法

排序演算法穩定性:

(1)穩定的排序演算法:待排序的序列中存在值相等的元素,經過排序後,相等元素之間前後順序不變。

(2)不穩定的演算法排序:待排序的序列中存在值相等的元素,經過排序後,相等元素之間的順序改變。

氣泡排序演算法每次只會操作相鄰兩個資料,一次冒泡至少會讓乙個元素移動到對應的位置,所以重複n次就能完成n個資料的排序工作。

// 氣泡排序

static

void

main

(string

args)

;bubblesort

(arrbubblesort, arrbubblesort.length)

; console.

writeline

("hello world!");

}public

static

void

bubblesort

(int

a,int n)

} console.

writeline

($"第次氣泡排序結果:,,,,,\n");

需要對上面**進行優化,當前**表示不管中間是有序,都要執行n次冒泡。其實,只要在氣泡排序中檢測是否有資料移動操作即可,當氣泡排序中沒有進行資料移動就可以判定該序列已經是有序序列了。

public

static

void

bubblesort

(int

a,int n)

} console.

writeline

($"第次氣泡排序結果:,,,,,\n");

if(return;}

}

分析優化後的氣泡排序演算法:

氣泡排序是否時原地排序演算法:是

氣泡排序是否是穩定的排序演算法:是(if(a[j]>a[j+1])時才進行資料移動)

氣泡排序的時間複雜度:

最好情況時間複雜度:序列為1,2,3,4,5,6情況時時間複雜度為o(n);

最壞情況時間複雜度:序列為6,5,4,3,2,1情況時時間複雜度為o(n^2);

平均情況時間複雜度:n個數排序共有n!種情況。每種情況的移動次數不同,推導出結合概率學的數學公式比較困難。引入一種新的分析方法:有序度和逆序度。

有序度:序列中有序對的個數,當類似1,2,3…n的序列,有序度可以用公式n*(n-1)/2表示,此時也被稱為滿有序度。

逆序度 = 滿有序度 - 有序度,逆序度也表示元素需要移動的次數。

此時分析氣泡排序平均時間複雜度:

最好情況下逆序度為0,最壞情況下逆序度為n*(n-1)/2,可以取中間值n*(n-1)/4,也就是說平均情況下需要n*(n-1)/4次交換次數,複雜度上限及最壞情況為o(n*n),所以平均時間複雜度為o(n*n)。

插入排序將陣列中的資料分為兩個區間:已排序區間和未排序區間。初始已排序區間只有陣列的第乙個元素。插入排序需要比較目標元素和已排序區間內的各個元素,找到合適位置時需要移動元素。

// 插入排序

static

void

main

(string

args)

;insertsort

(arrbubblesort, arrbubblesort.length)

; console.

writeline

("hello world!");

}public

static

void

insertsort

(int

a,int n)

else

} a[j +1]

=value

; console.

writeline

($"第次插入排序:,,,,,\n");

分析插入排序演算法:

插入排序是否時原地排序演算法:是

插入排序是否是穩定的排序演算法:是(if (a[j] > value)時才移動元素)

插入排序的時間複雜度:

最好情況時間複雜度:1,2,3,4,5,6需要從頭到尾遍歷一遍陣列o(n)

最壞情況時間複雜度:6,5,4,3,2,1從頭到尾遍歷陣列並且需要從尾到頭遍歷已排序區間o(n*n)

平均時間複雜度:

有序陣列a[n]中插入乙個元素的時間複雜度:乙個數插入的位置有n+1種可能,概率為1/(n+1),插入第一元素需要移動n個元素,插入最後乙個需要移動0個元素。由此平均時間複雜度:n/(n+1) + (n-1)/(n+1)+…+1/(n+1) = o(n)。插入排序是遍歷n個資料,每次遍歷都執行一次有序陣列的插入操作,所以插入操作平均時間複雜度為o(n*n)

選擇排序類似插入排序,但是插入排序是順序遍歷未排序區間序列,插入到已排序區間相應位置,選擇排序是找到未排序區間中最小的元素,插入到已排序區間的末尾。

// 選擇排序

static

void

main

(string

args)

;selectsort

(arrbubblesort, arrbubblesort.length)

; console.

writeline

("hello world!");

}public

static

void

selectsort

(int

a,int n)

} a[index]

= a[i]

; a[i]

= min;

console.

writeline

($"第次選擇排序:,,,,,\n");

分析選擇排序演算法:

選擇排序是否時原地排序演算法:是

選擇排序是否是穩定的排序演算法:否 如下圖所示,第一次選擇排序就將兩個5的順序顛倒了。

選擇排序的時間複雜度:

最好情況時間複雜度:1,2,3,4,5,6 查詢最小值需要遍歷未排序區間,n個元素的排序需要迴圈n次查詢最小值,即最好情況時間複雜度:o(n*n)

最壞情況時間複雜度:o(n*n)分析同上

平均時間複雜度:o(n*n)

排序演算法 冒泡,插入,選擇排序

演算法原理 從小到大排序為例 將陣列分成兩部分,左邊部分為已排序部分,右邊部分為未排序部分 從未排序部分的右側開始比較遍歷,相鄰兩個元素比較,保證小元素在前,即如果num j num j 1 就做元素交換,否則不交換 交換到左右兩部分的邊界處,右邊第乙個元素即為右邊部分最小元素,左邊最後乙個元素即為...

演算法 插入選擇氣泡排序

演算法 排序 n 2 時間複雜度是o n 2 的排序有插入,選擇,冒泡。由於演算法思想比較簡單易懂,也不複雜。我們就簡單講講。插入排序 乙個元素是有序的,從第二個元素開始,依次將每個元素插入到前面序列的對應位置,最終整個序列有序。外層n 1趟。void insertsort int a,int n ...

冒泡,插入,選擇排序

經典的排序演算法,此文章介紹三個 氣泡排序 它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。public void bubblesort int a while iswrap for int ...