您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關C++中怎么實現非遞歸排序,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
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)插入排序插入排序的意思就是說,我們把數據分成兩個部分,一部分是已經排好序的數據,一部分是當前還沒有完成排序的數據。那么這么說來的話,排序的過程是不是就是把沒有排序的數據逐個插入到已經排好序的隊列中的過程呢。大家可以自己先試一下,然后再看看我的代碼對不對? 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; }else{ break; } } } } 那么插入排序有沒有像冒泡排序那樣的改進方法呢?其實沒有。因為每一次插入排序的位置都是局部比較的結果,而冒泡排序每一次的內容都是全局最優的。這從數據比較的次數就可以看出來。(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)如果可能的情況下,多使用已經驗證的代碼和函數
以上就是C++中怎么實現非遞歸排序,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。