java萌新的進化旅程07

2021-09-01 14:40:26 字數 3725 閱讀 7322

本篇部落格主要介紹排序的四種基本方法:氣泡排序、選擇排序、直接插入排序、shell排序

氣泡排序(bubble sort)是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。

這個演算法的名字由來是因為越大的元素會經由交換慢慢「浮」到數列的頂端,故名氣泡排序。

氣泡排序的流程圖

氣泡排序一共比較n-1趟

氣泡排序的例題

public

static

void

bubblesort()

;int max=0;

int tmp=arr.length;

for(

int i =

0; i < tmp-

1; i++)}

} system.out.

println

(arrays.

tostring

(arr));

}

由此可見

氣泡排序的時間複雜度:o(n^2)

空間複雜度:o(1)

是否為穩定排序:是

在這裡細心的人可能會發現乙個問題,氣泡排序中有時候會對兩個本就有序的值比較,例如上面流程圖中的第2趟第三列,3<4,但是仍然進行了一次比較,這樣做比較浪費時間,所以下面對冒泡進行優化。

首先,思路是這樣的,設定乙個標記位來標記是否發生了交換,如果沒有發生交換就提前結束,具體實施如下:

public

static

void

bubblesort()

;int max=0;

int tmp=arr.length;

for(

int i =

0; i < tmp-

1; i++)}

if(!true)}

system.out.

println

(arrays.

tostring

(arr));

}

氣泡排序優化後的最好情況的時間複雜度:o(n)選擇排序(selection sort)是一種簡單直觀的排序演算法。它的工作原理是每一次從待排序的資料元素中選出最小(或最大)的乙個元素,存放在序列的起始位置,直到全部待排序的資料元素排完。

選擇排序的流程圖

選擇排序一共比較n-1趟

在這裡可以看出選擇排序與氣泡排序十分相似,這也是很多初學者容易混淆的地方,這兩種排序的**也很相近。

選擇排序的例題

public

static

void

selectsort

(int arr)

}}system.out.

print

(arrays.

tostring

(arr));

}

由此可見

選擇排序的時間複雜度:o(n^2)

空間複雜度:o(1)

是否為穩定排序:否

直接插入排序(straight insertion sort)是一種最簡單的排序方法,其基本操作是將一條記錄插入到已排好的有序表中,從而得到乙個新的、記錄數量增1的有序表。

這個東西可能不太好理解,這裡舉個例子:

在日常生活中,經常碰到這樣一類排序問題:把新的資料插入到已經排好的資料列中。例如:一組從小到大排好順序的資料列,通常稱之為有序列,我們用序號1,2,3,…表示資料的位置,欲把乙個新的資料8插入到上述序列中。

完成這個工作的步驟:

①確定資料"8"在原有序列中應該占有的位置序號。資料"8"所處的位置應滿足小於或等於該位置右邊所有的資料,大於其左邊位置上所有的資料。

②將這個位置空出來,將資料"8"插進去。

直接插入排序流程圖

直接插入排序的例題

public

static

void

insertsort

(int

arr)

else

} arr[j+1]

=tmp;

} system.out.

println

(arrays.

tostring

(arr));

}

由此可見

直接插入排序的時間複雜度:時間複雜度:

無序:0(n^2)

有序:0(n)

越有序越快

空間複雜度:o(1)

是否為穩定排序:否

shell排序的核心思想是將一組陣列拆分為幾組,然後這幾組內進行排序。

如果有10000個資料,普通排序要進行10000^2次,而shell排序則只用進行1000000次

shell排序的流程圖

shell排序的例題

public

class

shellsort

;shellsort

(arr);}

public

static

void

shellsort

(int arr)

;for

(int i =

0; i

) system.out.

println

(arrays.

tostring

(arr));

}public

static

void

shell

(int arr,

int gap)

else

} arr[j+gap]

=tmp;}}

}

注意:

shell排序的執行時間依賴於增量序列。

好的增量序列的共同特徵:

① 最後乙個增量必須為1;

② 應該盡量避免序列中的值(尤其是相鄰的值)互為倍數的情況。

shell排序的時間複雜度:平均情況o(n^1.3)

空間複雜度:o(1)

是否為穩定排序:否

最後在結尾處附上一張圖

新的旅程,新的開始

註冊很久了,一直沒有開通,總感覺缺少些什麼,今天終於鼓起勇氣決定開始在這個部落格記錄下東西。做程式猿,差不多3,4年了,算是經歷了些東西,有段時間真的很難過,很苦很累,挺過去了,現在好點了,但是還沒有完。難過過,開心過,迷茫過,堅持著!因為各種問題 生活,工作環境 難過過,因為朋友 家人 解決問題開...

新的旅程,新的開始!

雖說後來又申請了幾個不同的部落格賬號了,可要麼不能用windows live wirter寫部落格,要麼就是個人不喜歡那裡的空間排版,總之選來選去,還是喜歡駐紮在這個園子裡,很高興今天開始又成為園子的一員,今後我會在園子裡用文字 記錄和展示乙個最真實的我 我也會與真誠的朋友們交流分享我的心情和身邊趣...

Ubuntu的新旅程

之前呢,手上有張關於 mandriva的盤,可能是2.4的核,很多命令工具都沒有,同事建議安裝ubuntu,自己試了下,果然安裝很方便。當然opensolaris自己沒安裝起來,這部分不太會安裝 以後用到再看吧。昨天安裝了ubuntu,但不小心安裝的是中文,本來可以更改一下系統裡的語言設定,出於對s...