用Ruby實現算法--插入排序與快速排序

插入排序

插入排序的靈感也許來自于撲克牌, 將n按照大小插入到0~n-1中, 當左邊都排序好了, 整個數組也就排序好了

3 5 1 2 4 7 6 8
3 5 1 2 4 7 6 8
1 3 5 2 4 7 6 8
1 2 3 5 4 7 6 8
1 2 3 4 5 7 6 8
1 2 3 4 5 7 6 8
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8

def insertion_sort(array)
  return n if array.size == 1
  array.each_with_index do |n,i|
    j = i-1
    while array[j] > n && j >= 0
      tmp = array[j]
      array[j] = n
      array[j+1] = tmp
      j -= 1
    end
  end
  array
end

雖然插入排序的的最差時間是O(n^2), 但是對于已經排序好的數組來說, 排序時間只有O(n)

快速排序

快速排序是最簡單, 效率最好的通用排序算法之一

快速排序利用了分治法的思想, 取出數組的第一個值, 作為pviot
比pviot小的值放在左邊, 大的放在右邊
層層遞歸之后, 數組就排序完成

def quick_sort(array)
  return array if array.size <= 1
  array.shuffle
  left, right = array[1..-1].partition {|n| n <= array.first}
  quick_sort(left) + [array.first] + quick_sort(right)
end

快排的復雜度只有O(n*ln(n)), 與插入排序相比, 速度提高了一個級別
對于已經排序好的數組來說, pviot的取值會導致, 左邊的數組的值遠遠多余右邊的數組, 這樣會大大降低快排的效率
所以 在排序前打亂數組對快排來說反而是有益的

使用一下代碼對插入排序和快速排序測試,


a = Array.new
10000.times {a << rand(999)}
b = a.clone

o = Time.now
insertion_sort a
puts Time.now-o


p = Time.now
quick_sort b
puts Time.now-p
insertion_sort: 2.610087
quick_sort: 0.2639

可以看到兩個算法在對大數組排序時的性能差距

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 【1】7,9,-1,5,( ) A、4;B、2;C、-1;D、-3 分析:選D,7+9=16;9+(-1)=8;(...
    Alex_bingo閱讀 19,121評論 1 19
  • 概述:排序有內部排序和外部排序,內部排序是數據記錄在內存中進行排序,而外部排序是因排序的數據很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,743評論 0 15
  • 她說,她晚餐吃了兩個餅兩個包子半碗稀飯,還半路了同事吃了兩個羊肉串。 嘿嘿,吃的飽飽的! 我多次經過她上班的地方,...
    梁先生和梁夫人閱讀 201評論 0 1
  • 到今天為止,我到簡書也一個月了,雖然想堅持日更,但卻不得不說堅持日更挺難的,所以斷斷續續也有幾天沒有更新。 昨天晚...
    鄒小芝閱讀 660評論 48 23
  • 娘在,兄弟姐妹是一家; 娘不在,兄弟姐妹是親戚! 字字感人肺腑! 娘在,家就在。 但凡有娘的孩子,大都有一個可以回...
    TWE閱讀 10,760評論 0 0