排序是我曾經的朋友

   多少年前,我就與你在一起,曾經把你保存我電腦裏,

   多少年後,積攢的東西太多,以至於找不到你了,

   不知道,是你已經離開了我,還是我拋棄了你,

   這次我把你放在這裏,願永遠伴我左右.....

   說到排序,相信每一個程序員沒有不知道的,就像走路喫飯一樣平常,當你多年來,一直沒有使用了,還能一次性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

   

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章