多少年前,我就與你在一起,曾經把你保存我電腦裏,
多少年後,積攢的東西太多,以至於找不到你了,
不知道,是你已經離開了我,還是我拋棄了你,
這次我把你放在這裏,願永遠伴我左右.....
說到排序,相信每一個程序員沒有不知道的,就像走路喫飯一樣平常,當你多年來,一直沒有使用了,還能一次性code出來,
如果不能在心裏走一圈,非要debug的話,那她正在遠離你.....
我把排序歸爲兩種,小數據列與大數據列。
小數據列,我分爲冒泡排序、插入排序、選擇排序和希爾排序等,
大數據列, 我分爲快速排序、歸併排序等
一、 小數據列
1、 冒泡排序:
基本原理:
1.比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
2.對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
3.針對所有的元素重複以上的步驟,除了最後一個。
4.持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較
源碼:
時間複雜度: O(n²)
2、插入排序
基本原理:
1.從第一個元素開始,該元素可以認爲已經被排序
2.取出下一個元素,在已經排序的元素序列中從後向前掃描
3.如果該元素(已排序)大於新元素,將該元素移到下一位置
4.重複步驟3,直到找到已排序的元素小於或者等於新元素的位置
5.將新元素插入到該位置後
6.重複步驟2~5
源碼:
時間複雜度:O(n)~O(n²)
3、選擇排序
基本原理:
首先在未排序序列中找到最小(大)元素,
存放到排序序列的起始位置,
然後,再從剩餘未排序元素中繼續尋找最小(大)元素,
然後放到已排序序列的末尾。以此類推,直到所有元素均排序完畢
源碼:
時間複雜度:O(n²)
4、希爾排序
基本原理:
先取一個小於n的整數d1作爲第一個增量,把文件的全部記錄分成d1個組。
所有距離爲d1的倍數的記錄放在同一個組中。先在各組內進行直接插入排序;
然後,取第二個增量d2<d1重複上述的分組和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),
即所有記錄放在同一組中進行直接插入排序爲止
源碼:
時間複雜度:O(nlog2^n)~O(n^1.5)
二、大數據列
1、快速排序
基本原理:
1.從數列中挑出一個元素,稱爲 "基準"(pivot)。
2.重新排序數列,所有元素比基準值小的擺放在基準前面,
所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。
在這個分區退出之後,該基準就處於數列的中間位置。這個稱爲分區(partition)操作。
3.遞歸地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。
源碼:
時間複雜度:O(nlogn)~O(n²)
2、歸併排序
基本原理:
1.申請空間,使其大小爲兩個已經排序序列之和,該空間用來存放合併後的序列
2.設定兩個指針,最初位置分別爲兩個已經排序序列的起始位置
3.比較兩個指針所指向的元素,選擇相對小的元素放入到合併空間,並移動指針到下一位置
4.重複步驟3直到某一指針達到序列尾
5.將另一序列剩下的所有元素直接複製到合併序列尾
源碼:
時間複雜度:(n log n)/2 ~ nlog n - n + 1