吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

揭秘冒泡排序、交換排序和插入排序

Android編程精選 ? 來源:編程學習總站 ? 作者:寫代碼的牛頓 ? 2021-06-18 09:57 ? 次閱讀

01

冒泡排序

在實現冒泡排序代碼之前我們先理解一下什么是冒泡排序,我們舉一個現實生活中的例子來幫助我們理解。

操場排隊我們都知道吧,現在有一支隊伍,有的人身高一樣有的不一樣,這個時候我們需要一個教官對這支隊伍進行整理,使得隊伍里的人從低到高的排下去,教官想到了一種排序算法來對這支隊伍進行身高排序。

如何理解冒泡排序

教官立馬想到了一個排序算法,從第1個人開始往隊伍后面的方向相鄰的兩個人進行身高對比,如果前面的人比后一個人高則兩人交換位置。

最后最高的人排在了隊伍的最后面,教官又從第2個人開始往隊伍后面的方向,相鄰的2個人進行身高對比,如果前面的人比后一個人高則兩人交換位置,最后最高的人排在了隊伍的最后面。

由于前面的排序過程已經選出了隊伍里身高最高的人,所以后面的排序過程不對已經排好序的進行對比,最后教官重復上面的步驟最終將隊伍按身高從低到高的排好序。教官所用的排序算法正是冒泡排序算法,時間復雜度是O(n^2)。

冒泡排序的實現

現在我們用C++實現冒泡排序算法,定義一個模板類,聲明冒泡排序算法函數。

template《typename T》 class Sort{ public: void bubble_sort(T *arr, int size); //冒泡排序 };

冒泡排序實現代碼如下:

//冒泡排序 template《typename T》 void Sort《T》::bubble_sort(T *arr, int size) { if(arr == nullptr || size 《= 0){ return; } T temp; for(int i = 0; i 《 size; i++){ for(int j = 0; j 《 size - i; j++){ if(arr[j] 》 arr[j + 1]){ temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } }

02

交換排序

如何理解交換排序

前面教官使用了冒泡排序對隊伍進行了整理,已經按照身高從低到高的排序,但是從排序過程可以看出冒泡排序每個人互相進行過對比,做了不必要的重復工作,類似于這種a和b對比,b和a又進行對比。教官覺得這個排序算法效率不高,想要消除不必要的重復工作,于是又想到了一個排序算法。

教官先讓第1個個人走出隊列,從第2個人開始第1個人依次和隊伍里剩下的人進行對比,遇到比第1個人矮則互相交換位置,并且身高更矮的人繼續執行剩余人的身高對比,最后對比完整個隊伍,找出了最矮的人,將最矮的人放在第1位。

接下來教官讓第2個人走出來,從第3個人開始依次和隊伍里剩下的人進行對比,遇到比第2個人更矮的人和第一個人的處理方式一樣,最后找到次矮的人,將次矮的人放在了第2的位置。

最后教官重復上面的步驟,依次讓第3、4、5.。。。。.n-1個人走出隊列依次和隊伍里剩下的人進行身高對比,放在合適的位置。這種排序算法稱為交換排序,第1個人進行了(n-1)次對比,第2個人進行了(n-2)次對比。。。。。。第n-1個人進行了一次對比,所以時間復雜度是O(n^2)。

交換排序的實現

聲明交換排序函數

template《typename T》 class Sort{ public: void bubble_sort(T *arr, int size); //冒泡排序 void swap_sort(T *arr, int size); //交換排序 };

交換排序函數實現

//交換排序 template《typename T》 void Sort《T》::swap_sort(T *arr, int size) { if(arr == nullptr || size 《= 0){ return; } T temp; for(int i = 0; i 《 size - 1; i++){ for(int j = i + 1; j 《 size; j++){ if(arr[i] 》 arr[j]){ temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } } }

03

插入排序

如何理解插入排序

教官還是覺得算法不理想,效率不夠高,無論是冒泡排序和交換排序在隊伍里原本就是有序的情況下都要進行對比,那么有沒有一種排序算法在隊伍原本就是有序的情況下更快呢?教官最后想了很久終于想到了一種效率更高的排序算法。

教官把第1個人當做只有1個人的隊伍并且是有序的,讓第2個人走出隊伍,和第1個人進行對比身高,如果第2個人比第1個人矮那么第1個人就放到第2個人的位置,第2個人到第1個人的位置。進行過這一輪對比我們就知道,第1個人和第2個人是有序排列的。

同樣的,教官又叫第3個人走出隊列,從第2個人開始依次往前進行身高對比,比第3個人身高更高的人就往后挪一個位置,直到遇到身高比第3個人矮的人則停止對比,將第3個人排在這個人的身后。

最后教官依次讓第4、5、6.。。。。的人走出隊伍和上面的步驟一樣依次和前面的進行身高對比,找到合適的位置就插入,直到所有人從低到高的排序。時間復雜度是O(N^2),但是如果隊伍原本就是從低到高的排列,那么時間復雜度是O(N)。

插入排序代碼實現

教官所用的身高排序算法正是插入排序算法,現在我們用C++代碼實現插入排序算法,插入排序函數聲明如下。

template《typename T》 class Sort{ public: void insert_sort(T *arr, int size); //插入排序 void bubble_sort(T *arr, int size); //冒泡排序 void swap_sort(T *arr, int size); //交換排序 };

這里我們定義一個模板類,聲明插入排序算法,插入排序算法實現代碼如下:

//從小到大排序 template《typename T》 void Sort《T》::insert_sort(T *arr, int size){ if(arr == nullptr || size 《= 0){ return; } int i = 1; int j = 0; while(i 《 size){ T data = arr[i]; j = i - 1; while(j 》= 0 && arr[j] 》 data){ arr[j + 1] = arr[j]; //大的數據則往后挪 j--; } if(j 《 0){ j = 0; } arr[j] = data; i++; } }

04

結果驗證

現在我們寫一個小程序驗證一下算法的正確性。

int main() { int arr[10] = {8, 3, 21, 5, 6, 2, 3, 8, 1, 43}; Sort《int》 sort; std::cout 《《 “插入排序結果” 《《 std::endl; sort.insert_sort(arr, 10); //插入排序 for(int e : arr){ std::cout 《《 e 《《 “ ”; } std::cout 《《 std::endl; int arr2[10] = {8, 32, 56, 5, 7, 8, 98, 78, 6, 7}; sort.bubble_sort(arr2, 10); //冒泡排序 std::cout 《《 “冒泡排序結果” 《《 std::endl; for(int e : arr2){ std::cout 《《 e 《《 “ ”; } std::cout 《《 std::endl; int arr3[10] = {8, 4, 2, 3, 5, 6, 8, 3, 10, 50}; sort.swap_sort(arr3, 10); //交換排序 std::cout 《《 “交換排序結果” 《《 std::endl; for(int e : arr3){ std::cout 《《 e 《《 “ ”; } std::cout 《《 std::endl; return 0; }

編譯運行輸出如下:

插入排序結果 1 3 6 8 21 21 21 21 43 43 冒泡排序結果 0 5 6 7 7 8 8 32 56 78 交換排序結果 2 3 3 4 5 6 8 8 10 50

輸出結果完全正確,算法實現正確。

編輯:jq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 函數
    +關注

    關注

    3

    文章

    4346

    瀏覽量

    62973
  • C++
    C++
    +關注

    關注

    22

    文章

    2114

    瀏覽量

    73857
  • 代碼
    +關注

    關注

    30

    文章

    4827

    瀏覽量

    69054

原文標題:數據結構與算法篇-冒泡排序、交換排序和插入排序

文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    詳解Linux sort命令之掌握排序技巧與實用案例

    在linux系統使用過程中,提供了sort排序命令,支持常用的排序功能。 常用參數 sort命令支持很多參數,常用參數如下: ? 短參數 長參數 說明 -n – number-sort 按字符串數值
    的頭像 發表于 01-09 10:10 ?221次閱讀

    TimSort:一個在標準函數庫中廣泛使用的排序算法

    在計算機科學的領域,排序算法是每位學生必學的基礎,而排序的需求是每位程序員在編程過程中都會遇到的。 在你輕松調用 .sort() 方法對數據進行排序時,是否曾好奇過,這個簡單的方法背后使用的是哪種
    的頭像 發表于 01-03 11:42 ?125次閱讀

    時間復雜度為 O(n^2) 的排序算法

    作者:京東保險 王奕龍 對于小規模數據,我們可以選用時間復雜度為 O(n2) 的排序算法。因為時間復雜度并不代表實際代碼的執行時間,它省去了低階、系數和常數,僅代表的增長趨勢,所以在小規模數據情況下
    的頭像 發表于 10-19 16:31 ?1251次閱讀
    時間復雜度為 O(n^2) 的<b class='flag-5'>排序</b>算法

    TPS54120排序和跟蹤

    電子發燒友網站提供《TPS54120排序和跟蹤.pdf》資料免費下載
    發表于 10-10 10:54 ?0次下載
    TPS54120<b class='flag-5'>排序</b>和跟蹤

    手把手教你排序算法怎么寫

    今天以直接插入排序算法,給大家分享一下排序算法的實現思路,主要包含以下部分內容:插入排序介紹插入排序算法實現手把手教你排序算法怎么寫在添加新
    的頭像 發表于 06-04 08:03 ?774次閱讀
    手把手教你<b class='flag-5'>排序</b>算法怎么寫

    具有先進排序和輸出裕度的中輸入同步降壓控制器TPS40101數據表

    電子發燒友網站提供《具有先進排序和輸出裕度的中輸入同步降壓控制器TPS40101數據表.pdf》資料免費下載
    發表于 04-22 10:26 ?0次下載
    具有先進<b class='flag-5'>排序</b>和輸出裕度的中輸入同步降壓控制器TPS40101數據表

    具有先進排序和輸出裕度的中輸入同步降壓控制器TPS40100數據表

    電子發燒友網站提供《具有先進排序和輸出裕度的中輸入同步降壓控制器TPS40100數據表.pdf》資料免費下載
    發表于 04-17 10:59 ?0次下載
    具有先進<b class='flag-5'>排序</b>和輸出裕度的中輸入同步降壓控制器TPS40100數據表

    3-A、3.3/5V輸入、可調開關穩壓器,具有自動跟蹤TM排序功能PTH04000W數據表

    電子發燒友網站提供《3-A、3.3/5V輸入、可調開關穩壓器,具有自動跟蹤TM排序功能PTH04000W數據表.pdf》資料免費下載
    發表于 04-17 09:32 ?0次下載
    3-A、3.3/5V輸入、可調開關穩壓器,具有自動跟蹤TM<b class='flag-5'>排序</b>功能PTH04000W數據表

    Linux的sort命令介紹

    1.命令簡介以行為單位對文本文件的內容進行排序,將結果顯示在標準輸出,比較原則是從行首字符向后,依次按 ASCII 碼值進行比較,最后按升序輸出。如果 file 參數指定多個文件,那么 sort
    發表于 04-08 07:16

    支持 ACPI 的 10 軌電源排序器和監視器UCD9090A數據表

    電子發燒友網站提供《支持 ACPI 的 10 軌電源排序器和監視器UCD9090A數據表.pdf》資料免費下載
    發表于 03-29 09:12 ?0次下載
    支持 ACPI 的 10 軌電源<b class='flag-5'>排序</b>器和監視器UCD9090A數據表

    FPGA實現雙調排序方法詳解

    根據數據流的關系,我們可以采用單路徑延遲反饋(Single-pathDelay Feedback, SDF)運算單元流水結構,SDF單元如下圖所示。
    發表于 03-28 10:45 ?574次閱讀
    FPGA實現雙調<b class='flag-5'>排序</b>方法詳解

    用FPGA實現雙調排序的方法(2)

    典型的排序算法包括冒泡排序、選擇排序插入排序、歸并排序、快速
    的頭像 發表于 03-21 10:28 ?680次閱讀
    用FPGA實現雙調<b class='flag-5'>排序</b>的方法(2)

    FPGA實現雙調排序算法的探索與實踐

    雙調排序(BitonicSort)是數據獨立(Data-independent)的排序算法,即比較順序與數據無關,特別適合并行執行。在了解雙調排序算法之前,我們先來看看什么是雙調序列。
    發表于 03-14 09:50 ?710次閱讀
    FPGA實現雙調<b class='flag-5'>排序</b>算法的探索與實踐

    想聽聽48和大對數光纜的排序

    48芯光纜和大對數光纜都是光纜中的一種,它們的區別在于芯數不同。48芯光纜指的是光纜中包含48根光纖,而大對數光纜則是指光纜中芯數超過了48芯。 在實際的光纜應用中,不同芯數的光纜需要進行不同的排序
    的頭像 發表于 03-12 10:44 ?705次閱讀

    C語言實現經典排序算法概覽

    冒泡排序(英語:Bubble Sort)是一種簡單的排序算法。它重復地走訪過要排序的數列,一次比較兩個元素,如果他們的順序(如從大到小、首字母從A到Z)錯誤就把他們
    的頭像 發表于 02-25 12:27 ?485次閱讀
    C語言實現經典<b class='flag-5'>排序</b>算法概覽
    孙吴县| 百家乐筹码500| 百家乐官网tt娱乐场开户注册| 百家乐官网视频二人雀神| 百家乐官网有作弊的吗| 百家乐官网打水策略| 百家乐官网开户代理| 金狮国际| 阿尔山市| 百家乐官网波音平台导航网| 上海玩百家乐官网算不算违法| 七胜百家乐官网娱乐城总统网上娱乐城大都会娱乐城赌场 | 大发888官方 黄埔| 88娱乐城址| 松溪县| 百家乐官网视频交流| 百家乐官网高额投注| 新世纪百家乐官网的玩法技巧和规则 | 百家乐官网7scs| 百家乐平注法口诀技巧| 大发888 58| 新源县| 百家乐官网三珠连跳打法| 百家乐官网代理打| 24山向吉凶山运| 大世界百家乐娱乐场| 大发888娱乐大发体育| 足球赌网| 百家乐官网专打单跳投注法| 钱隆百家乐官网智能| 百家乐游戏台| 威尼斯人娱乐网注册| 久盛国际娱乐城| 赌场百家乐官网规则| 一共33楼24楼风水怎么说| 百家乐大小牌路的含义| 明升88备用| 百家乐官网代理每周返佣| 做生意的十大风水禁忌 | 金锁玉关24山砂水断| 威尼斯人娱乐场 28|