【C語言深度解剖】冒泡排序你那些不知道的問題!-創(chuàng)新互聯(lián)

C語言在實現(xiàn)冒泡排序時出現(xiàn)的問題

禹州網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,禹州網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為禹州千余家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站制作要多少錢,請找那個售后服務(wù)好的禹州做網(wǎng)站的公司定做!文章目錄
  • C語言在實現(xiàn)冒泡排序時出現(xiàn)的問題
  • 前言
  • 一、冒泡排序是什么?
  • 二、使用步驟
    • 1.簡單冒泡排序
    • 2.高級冒泡排序(針對于所有排序)
    • (1)main函數(shù)中參數(shù)的選擇
    • (2)bubblesort函數(shù)的實現(xiàn)原理
    • (3)比較函數(shù)的實現(xiàn)
    • (4)交換函數(shù)的實現(xiàn)
    • (5)打印函數(shù)的實現(xiàn)
  • 總結(jié)


前言

它重復(fù)地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果順序(如從大到小、首字母從Z到A)錯誤就把他們交換過來。走訪元素的工作是重復(fù)地進行,直到?jīng)]有相鄰元素需要交換,也就是說該元素列已經(jīng)排序完成。


提示:以下是本篇文章正文內(nèi)容,下面案例可供參考

一、冒泡排序是什么?

冒泡排序(Bubble Sort),是一種計算機科學(xué)領(lǐng)域的較簡單的排序算法。

二、使用步驟 1.簡單冒泡排序

代碼如下(示例):

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é)構(gòu)體成員進行排序,所以接下來我為大家講解高級冒泡排序?。?!

2.高級冒泡排序(針對于所有排序)

首先我們要實現(xiàn)main函數(shù),對于實現(xiàn)高級冒泡排序,我引用qsort庫函數(shù)的知識!

這個就是qsort的函數(shù)參數(shù)(MSDN獲?。?,在四個參數(shù)中,第一個參數(shù)用指針void*來接受,即它可以表示任意類型的數(shù)組!二三參數(shù)分別表示元素個數(shù)和元素一個的寬度!最后一個參數(shù)較為復(fù)雜,下文會有詳解!
以qsort庫函數(shù)參數(shù)為例,可以對BubbleSort函數(shù)參數(shù)全面改造一下


void bubblesort(void* base,int num,int width,int(*cmp)(const void*e1,const void*e2)

可能會有同學(xué)問為什么左后一個參數(shù)里面是void* e1和void* e2
因為我們不知道比較兩個元素的類型,const表示只比較,不修改?。?!

(1)main函數(shù)中參數(shù)的選擇
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ù)的實現(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實現(xiàn)和簡單冒泡排序?qū)崿F(xiàn)原理一樣,只是把原來的sz改成了num。
第二個for循環(huán)里面會有所不同

int j = 0;
        for (j = 0; j< num - 1 - i; j++)
        {if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) >0)
            {
            }
        }

bubblesort最后一個參數(shù)是函數(shù)指針,通過cmp就可以把cmp中第一個參數(shù)base+j*width和第二個參數(shù)base+(j+1)*width進行比較,此時j=0;訪問的兩個元素即為第一個元素和第二個元素,如果對文字有誤解可以觀看圖文解釋!
在這里插入圖片描述總的來說,隨著j的增長,會不斷訪問兩個相鄰的元素!

(3)比較函數(shù)的實現(xiàn)

既然我們知道了通過cmp可以找到相鄰兩個元素,那么我們就來實現(xiàn)比較函數(shù)!

int cmp_int(const void* e1, const void* e2)
{return (*(int*)e1 - *(int*)e2);
}

此時e1和e2兩個形式參數(shù)傳過來的就是9和8
把他們強制類型轉(zhuǎn)換為int類型之后再進行比較(直接減法,return返回后和0進行比較)

(4)交換函數(shù)的實現(xià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ù)一樣,這里就不多介紹!重點是交換函數(shù)的實現(xiàn)過程!

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++;
    }
}

目前我的編譯器是小端存儲,如下圖:
在這里插入圖片描述

(5)打印函數(shù)的實現(xiàn)

這個模塊相對來說簡單一些

void print_arr(int arr[], int sz)
{int i = 0;
    for (i = 0; i< sz; i++)
    {printf("%d ", arr[i]);
    }
}

總結(jié)

以上就是今天要和大家分享的內(nèi)容,兩種冒泡排序的實現(xiàn)原理
日后還會為大家?guī)頂?shù)據(jù)結(jié)構(gòu)、c++STL的知識,希望大家可以多多關(guān)注
這篇文章是原著,如果有哪里不對的地方,多多指教!?。?/p>

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

網(wǎng)站名稱:【C語言深度解剖】冒泡排序你那些不知道的問題!-創(chuàng)新互聯(lián)
網(wǎng)頁網(wǎng)址:http://bm7419.com/article36/dssjsg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、搜索引擎優(yōu)化、電子商務(wù)、企業(yè)建站、服務(wù)器托管、網(wǎng)站營銷

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)