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