非遞迴排序

2021-06-25 15:10:39 字數 1607 閱讀 1980

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

(1)氣泡排序

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

[cpp]view plain

copy

void bubble_sort(int array, int length)  

}  }  }  

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

[cpp]view plain

copy

void bubble_sort(int array, int length)  

}  }  }  

(2) 插入排序

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

[cpp]view plain

copy

void insert_sort(int array, int length)  

else  

}  }  

}  

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

(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排列;第三輪就和氣泡排序一樣了,以此對每個資料進行排列。它的優勢就是讓整個佇列基本有序,減少資料移動的次數,從而降低演算法的計算複雜度。

[cpp]view plain

copy

void shell_sort(int array, int length, int step)  

for(;  outer >= (index + step);  outer -= step)  

}  }  

}  }  

}  

總結:

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

(2)**編寫的時候務必注意測試用例的設計

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

堆排序(非遞迴)

以下 經測試,排序5000000 五千萬 int型資料沒有問題!第乙個引數是陣列首位址 第二個引數是陣列元素個數 void heapsort int const arr,const dword number 堆排序 indexup number 1 if 0 indexup 2 indexup fo...

堆排序(非遞迴)

將原問題劃分為乙個規模更小的子問題 分治法 結構清晰,量少,可讀性強。但同時遞迴也存在以下缺點 遞迴呼叫函式,時間開銷大。遞迴太深容易導致堆疊溢位。為了能解決上述兩個缺點,本文採用了非遞迴實現了非遞迴版本的堆排序演算法。但需要注意的是,非遞迴版的堆排序演算法,減少了函式的呼叫次數,避免了堆疊溢位的可...

快速排序實現(遞迴 非遞迴)

首先是劃分演算法,假設每次都以第乙個元素作為樞軸值,進行一趟劃分 int partition int a,int low,int high a low pivot 將樞軸值元素置於最終位置 return low 第乙個while迴圈裡的 還可以採用如下形式 while low high a high...