總體思想是通過兩層循環,逐個來確定當前最值,并通過交換,把最值逐漸移動到某一端,從而完成升序或者降序排序,這段代碼采用的是升序,也就是逐個把當前的大值挪向數組右邊。
冒泡排序中,選出了一個大值,放在了某一端,下一輪就不會訪問到這個上一輪的大值了,而是從剩下的數中進行選擇,這里通過while循環來控制“冒泡“的次數,length為數組長度,每一輪冒泡確定當前的最值,也就是一共需要進行length次循環,length用于計數,所以每執行一輪排序,需要length--,直到減為0也就是完成了length次循環,while內層用一個for循環從數組的0號位置的元素往后遍歷如果當前這個arr[ i ]大于arr[ i+1 ]就對這兩個數進行交換的操作,遍歷到i=當前的length-1時就停止(每一個arr[ i?]都是和arr[ i+1 ]比較)。
3.冒泡排序的完善? 有可能某一步的循環中,實際上上剩下的部分已經是完好的升序排列了,這一次循環就沒有進行交換,后面的循環如果繼續進行同樣不會進行交換,也就變成了多余的步驟,所以我們可以對這個排序算法進行優化,引入一個用來控制while循環的數字flag(旗幟),先設置它為1(真),進入while循環之后立馬讓它等于0(假),如果滿足交換的條件進行了交換,再重新把他的值變為1,以便于下輪while循環能夠進行,如果這一輪中沒有進行交換的操作,就說明這些數已經是升序排列了,就不會把flag的值改成1了,flag=0,之后的while循環也就不會再執行了。
void bob_sort(int arr[], int length) {
int flag = 1;
while (length-- && flag == 1) {
flag = 0;
for (int i = 0; i< length; i++) {
if (arr[i] >arr[i + 1]) {
flag = 1;
int tem = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = tem;
}
}
}
}
2.選擇排序? 選擇排序同樣也是雙層循環,第一層控制的是循環執行的次數,每執行完內層循環,最多完成一次交換,并確定一個當下最值,以及每一次外層循環的 i?值對應的位置就是這一輪內層循環所選擇出的最值應該被放置的位置,每一輪內層循環篩選一個最小的元素值所對應的下標,每次執行內層循環先默認當前的?j?號元素為最小值,用a記錄,往后遍歷數組,遇到更小的arr[ i ]后就用令a=i,把a值更新,遍歷完后,那個a值下標對應的數組元素也就是最值,將這個值arr[ a ]與arr[ i ]交換后,i號元素也就是這次循環所確定下來的最值了
? 選擇排序減少的是交換的次數,用變量儲存數組元素下標后只需要更新這個記錄值就可以了,遍歷完后才只需要執行一次交換。
void select_sort(int arr[], int length) {
for (int i = 0; i< length; i++) {
int a = i;
for (int j = i + 1; j< length; j++) {
if (arr[j]< arr[a]) {
a = j;
}
}
int tem = arr[i];
arr[i] = arr[a];
arr[a] = tem;
}
}
3.插入排序? 外層循環用來控制循環次數,讓i從1開始,比較它和前一個元素的大小,如果后置位的元素要比前置位要小,就進入內層循環,將這個元素和所有在他前置位的元素一一比較大小,滿足后置位小于前置位的條件后,執行交換兩者的操作,直到遇到了比它小的元素后停止內層循環,這個元素也就拍好了位置,i 繼續自增,往后繼續逐個給元素排位置。
? 插入排序的中心就是從i=1號位元素開始往后面排位置,他能保證在每次內層循環開始時,當前的 i 號元素之前的所有元素都是有序的,需要做的只是把該 i 號元素插入到應該的位置上。思路上面理解起來會比較清晰,后面所學到的希爾排序,實際上也是對插入排序的一種優化。
void sert_sort(int arr[], int length) {
for (int i = 1; i< length; i++) {
if (arr[i]< arr[i - 1]) {
for (int j = i; j >= 1 && arr[j]< arr[j - 1]; j--) {
int tem = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = tem;
}
}
}
}
4.希爾排序
? ? ? ? 1.大致思路介紹希爾排序實際上是對插入排序的一個優化版本,思路其實和插入排序如出一轍,在希爾排序中,我們引入了一個新的概念,叫做步長,換一種說法,插入排序就是步長為1的希爾排序,當數據量特別龐大的時候,步長為1的話就會過于緩慢,所以需要自己設置一個步長,根據這個步長,給數據分組,分組后再比較大小,前者比后者小,即交換,比如步長為1的時候,相鄰的元素都會兩兩一組來進行比較,步長為2的時候就是每一個元素與他后面第二個元素為一組,來進行比較。
最外層的while循環用來控制輪數,每進行一輪就縮短步長(步長除2),直到步長為1執行后就停止,內層循環中,令i從步長h處開始,跟他前一個步長距離的元素去做比較,后置位的元素要是小于前置位的元素就執行交換。
? 需要注意的一點就是,希爾排序中,當滿足后置位元素小于前置位元素而進入最內層循環的時候,該后置位元素前面的元素不止一個前置位元素時,后置位那個元素依次和前面的元素比較,內層循環的 j 不能 j--,而是應該j-=h,往前跨的是步長,如果j--的話,就和步長為1的插入排序沒有區別了,反倒是會多出很多贅余的步驟。
void shell_sort(int arr[], int length) {
int h = length / 3;
while (h >= 1) {
for (int i = h; i< length; i++) {
if (arr[i]< arr[i - h]) {
for (int j = i; j >= h && arr[j]< arr[j - h]; j -= h) {
int tem = arr[j];
arr[j] = arr[j - h];
arr[j - h] = tem;
}
}
}
h /= 2;
}
}
你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧
網站標題:C++實現冒泡,選擇,插入排序算法-創新互聯
地址分享:http://www.yijiale78.com/article12/cdpjdc.html
成都網站建設公司_創新互聯,為您提供虛擬主機、ChatGPT、微信小程序、網站設計、靜態網站、App開發
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯