它重復(fù)地走訪過(guò)要排序的元素列,依次比較兩個(gè)相鄰的元素,如果順序(如從大到小、首字母從Z到A)錯(cuò)誤就把他們交換過(guò)來(lái)。走訪元素的工作是重復(fù)地進(jìn)行,直到?jīng)]有相鄰元素需要交換,也就是說(shuō)該元素列已經(jīng)排序完成。
提示:以下是本篇文章正文內(nèi)容,下面案例可供參考
冒泡排序(Bubble Sort),是一種計(jì)算機(jī)科學(xué)領(lǐng)域的較簡(jiǎn)單的排序算法。
二、使用步驟 1.簡(jiǎn)單冒泡排序代碼如下(示例):
void bubblesort(int arr[], int sz)
{int i = 0;
for (i = 0; i< sz-1;i++)
{int j = 0;
for (j = 0; j< sz - 1 - i; j++)
{if (arr[j] >arr[j + 1])
{int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
void print_arr(int arr[], int sz)
{int i = 0;
for (i = 0; i< sz; i++)
{printf("%d ", arr[i]);
}
}
int main()
{int arr[10] = {9,8,7,6,5,4,3,2,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz);
print_arr(arr, sz);
}
簡(jiǎn)單的冒泡排序具有一定的局限性,它無(wú)法對(duì)字符串或者結(jié)構(gòu)體成員進(jìn)行排序,所以接下來(lái)我為大家講解高級(jí)冒泡排序?。?!
2.高級(jí)冒泡排序(針對(duì)于所有排序)首先我們要實(shí)現(xiàn)main函數(shù),對(duì)于實(shí)現(xiàn)高級(jí)冒泡排序,我引用qsort庫(kù)函數(shù)的知識(shí)!
這個(gè)就是qsort的函數(shù)參數(shù)(MSDN獲取),在四個(gè)參數(shù)中,第一個(gè)參數(shù)用指針void*來(lái)接受,即它可以表示任意類(lèi)型的數(shù)組!二三參數(shù)分別表示元素個(gè)數(shù)和元素一個(gè)的寬度!最后一個(gè)參數(shù)較為復(fù)雜,下文會(huì)有詳解!
以qsort庫(kù)函數(shù)參數(shù)為例,可以對(duì)BubbleSort函數(shù)參數(shù)全面改造一下
void bubblesort(void* base,int num,int width,int(*cmp)(const void*e1,const void*e2)
可能會(huì)有同學(xué)問(wèn)為什么左后一個(gè)參數(shù)里面是void* e1和void* e2
因?yàn)槲覀儾恢辣容^兩個(gè)元素的類(lèi)型,const表示只比較,不修改?。?!
int main()
{int arr[10] = {9,8,7,6,5,4,3,2,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubblesort(arr, sz, sizeof(arr[0]), cmp_int);
print_arr(arr, sz);
}
這里的bubblesort傳參就和qsort傳參原理一致!
(2)bubblesort函數(shù)的實(shí)現(xiàn)原理void bubblesort(void* base, int num, int width, int (*cmp)(const void* e1, const void* e2))
{int i = 0;
for (i = 0; i< num - 1; i++)
{int j = 0;
for (j = 0; j< num - 1 - i; j++)
{
}
}
}
bubblesort實(shí)現(xiàn)和簡(jiǎn)單冒泡排序?qū)崿F(xiàn)原理一樣,只是把原來(lái)的sz改成了num。
第二個(gè)for循環(huán)里面會(huì)有所不同
int j = 0;
for (j = 0; j< num - 1 - i; j++)
{if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) >0)
{
}
}
bubblesort最后一個(gè)參數(shù)是函數(shù)指針,通過(guò)cmp就可以把cmp中第一個(gè)參數(shù)base+j*width和第二個(gè)參數(shù)base+(j+1)*width進(jìn)行比較,此時(shí)j=0;訪問(wèn)的兩個(gè)元素即為第一個(gè)元素和第二個(gè)元素,如果對(duì)文字有誤解可以觀看圖文解釋?zhuān)?br />總的來(lái)說(shuō),隨著j的增長(zhǎng),會(huì)不斷訪問(wèn)兩個(gè)相鄰的元素!
既然我們知道了通過(guò)cmp可以找到相鄰兩個(gè)元素,那么我們就來(lái)實(shí)現(xiàn)比較函數(shù)!
int cmp_int(const void* e1, const void* e2)
{return (*(int*)e1 - *(int*)e2);
}
此時(shí)e1和e2兩個(gè)形式參數(shù)傳過(guò)來(lái)的就是9和8
把他們強(qiáng)制類(lèi)型轉(zhuǎn)換為int類(lèi)型之后再進(jìn)行比較(直接減法,return返回后和0進(jìn)行比較)
if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) >0)
{//交換函數(shù)
Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
}
交換函數(shù)的參數(shù)和比較函數(shù)的參數(shù)一樣,這里就不多介紹!重點(diǎn)是交換函數(shù)的實(shí)現(xiàn)過(guò)程!
void Swap(char* buf1, char* buf2, int width)
{int i = 0;
for (i = 0; i< width; i++)
{char tmp = *buf1;
*buf1 = *buf2;
*buf2 = tmp;
buf1++;
buf2++;
}
}
目前我的編譯器是小端存儲(chǔ),如下圖:
這個(gè)模塊相對(duì)來(lái)說(shuō)簡(jiǎn)單一些
void print_arr(int arr[], int sz)
{int i = 0;
for (i = 0; i< sz; i++)
{printf("%d ", arr[i]);
}
}
以上就是今天要和大家分享的內(nèi)容,兩種冒泡排序的實(shí)現(xiàn)原理
日后還會(huì)為大家?guī)?lái)數(shù)據(jù)結(jié)構(gòu)、c++STL的知識(shí),希望大家可以多多關(guān)注
這篇文章是原著,如果有哪里不對(duì)的地方,多多指教!??!
你是否還在尋找穩(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)站名稱(chēng):【C語(yǔ)言深度解剖】冒泡排序你那些不知道的問(wèn)題!-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)網(wǎng)址:http://jinyejixie.com/article36/dssjsg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、搜索引擎優(yōu)化、電子商務(wù)、企業(yè)建站、服務(wù)器托管、網(wǎng)站營(yíng)銷(xiāo)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(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í)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容