非遞迴排序

來源:互聯網
上載者:User

 在上面一篇部落格當中,我們發現普通尋找和排序尋找的效能差別很大。作為一個100萬的資料,如果使用普通的尋找方法,那麼每一個資料尋找平均下來就要幾十萬次,那麼二分法的尋找呢,20多次就可以搞定。這中間的差別是非常明顯的。既然排序有這麼好的效果,那麼這篇部落格中,我們就對排序算做一個總結。

    按照我個人的理解,排序可以分為兩種:一種是非遞迴排序,它主要按照非遞迴的方法對資料進行排序,也就是說主要資料的移位和迴圈來完成;另外一種就是遞迴方法,我們在排列當前資料的時候首先把子資料排列有序,然後才會排列當前的資料。這種不斷遞迴調用的方法就是遞迴排序。

    非遞迴排序的方法很多,這裡主要介紹冒泡排序、插入排序、希爾排序;遞迴的方法也不少,這裡介紹的方法是快速排序、歸併排序和堆排序。排序的內容很多,本篇部落客要介紹非遞迴排序,遞迴排序的內容主要在下一節內容解決。

    (1)冒泡排序

    冒泡排序的內容並不複雜。假設有n個資料需要排序,那麼我們需要確定n個從大到小的資料,每一次都挑選第n大的資料是多少,並且放大相應的位置。直到所有的資料都排列整齊了,那麼我們的排序就結束了。

void bubble_sort(int array[], int length){int inner = 0, outer = 0;int median = 0;if(NULL == array || 0 == length)return;for(outer = length-1; outer >= 1; outer --){for(inner = 0; inner < outer; inner ++){if(array[inner] > array[inner + 1]){median = array[inner];array[inner] = array[inner + 1];array[inner + 1] = median;}}}}

那麼這個程式有沒有什麼改進的地方呢?當然存在,如果發現在一次遍曆迴圈之中,如果沒有發生移位的現象,那麼是不是可以判斷這個排序可以結束了呢?朋友們可以好好思考一下這個問題?

 

void bubble_sort(int array[], int length){int inner = 0, outer = 0;int median = 0;int flag = 1;if(NULL == array || 0 == length)return;for(outer = length-1; outer >= 1 && flag; outer --){flag = 0;for(inner = 0; inner < outer; inner ++){if(array[inner] > array[inner + 1]){median = array[inner];array[inner] = array[inner + 1];array[inner + 1] = median;if(flag == 0)flag = 1;}}}}

   (2) 插入排序

    插入排序的意思就是說,我們把資料分成兩個部分,一部分是已經排好序的資料,一部分是當前還沒有完成排序的資料。那麼這麼說來的話,排序的過程是不是就是把沒有排序的資料逐個插入到已經排好序的隊列中的過程呢。大家可以自己先試一下,然後再看看My Code對不對?

 

void insert_sort(int array[], int length){int inner = 0;int outer = 0;int median = 0;if(NULL == array || 0 == length)return;for(outer = 1; outer <length; outer ++){for(inner = outer; inner >= 1; inner --){if(array[inner] < array[inner -1]){median = array[inner];array[inner] = array[inner -1];array[inner -1] = median;}}}}

 那麼插入排序有沒有像冒泡排序那樣的改進方法呢?其實沒有。因為每一次插入排序的位置都是局部比較的結果,而冒泡排序每一次的內容都是全域最優的。這從資料比較的次數就可以看出來。

    (3)希爾排序

    希爾排序,我個人認為可以看成是冒泡排序的變種。它的基本思想是:首先按照一個序列遞減的方法逐漸進行排序。比如說有10個資料,我們按照序列5、3、1的順序進行排序。首先是5,那麼我們對1和6、2和7、3和8、4和9、5和10進行排列;第二輪是3,那麼對資料1、4、7、10排列,再對2、5、8進行排列,以及3、6、9排列;第三輪就和冒泡排序一樣了,以此對每個資料進行排列。它的優勢就是讓整個隊列基本有序,減少資料移動的次數,從而降低演算法的計算複雜度。

void shell_sort(int array[], int length, int step){int inner = 0;int outer = 0;int median = 0;if(NULL == array || 0 == length)return;for(; step >= 1; step -=2){for(int index = 0; index < step; index ++){if((length -1) < (index + step))continue;else{outer = index + step;while( (outer + step) <= (length - 1))outer += step;}for(;  outer >= (index + step);  outer -= step){for(inner = index; inner <= outer - step; inner += step){if(array[inner] >= array[inner + step]){median = array[inner];array[inner] = array[inner + step];array[inner + step] = median;}}}}}}

總結:

    (1)上面的排序都是非遞迴程式,理解上不難,但是細節問題需要注意,特別是長度的問題

    (2)代碼編寫的時候務必注意測試案例的設計

    (3)如果可能的情況下,多使用已經驗證的代碼和函數

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.