本篇部落格主要介紹排序的四種基本方法:氣泡排序、選擇排序、直接插入排序、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...