日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

完善資料讓更多小伙伴認識你,還能領取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個人矮則互相交換位置,并且身高更矮的人繼續(xù)執(zhí)行剩余人的身高對比,最后對比完整個隊伍,找出了最矮的人,將最矮的人放在第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

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

    關注

    3

    文章

    4422

    瀏覽量

    67867
  • C++
    C++
    +關注

    關注

    22

    文章

    2131

    瀏覽量

    77416
  • 代碼
    +關注

    關注

    30

    文章

    4977

    瀏覽量

    74416

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    MAX16050/MAX16051:電壓監(jiān)測與排序電路的理想選擇

    MAX16050/MAX16051:電壓監(jiān)測與排序電路的理想選擇 在電子設計領域,對于電壓監(jiān)測和電源排序的需求日益增長,特別是在服務器、工作站、網絡系統等復雜設備中。今天,我們就來深入探討
    的頭像 發(fā)表于 03-02 09:15 ?167次閱讀

    深入解析 LTC2923:電源跟蹤與排序的理想解決方案

    深入解析 LTC2923:電源跟蹤與排序的理想解決方案 在電子設備的設計中,電源的跟蹤和排序至關重要,它直接影響著設備的性能和穩(wěn)定性。LTC2923 作為一款強大的電源跟蹤控制器,為我們提供了簡單
    的頭像 發(fā)表于 02-28 15:35 ?304次閱讀

    ADM6819/ADM6820:簡單電源排序器的技術剖析與應用指南

    ADM6819/ADM6820:簡單電源排序器的技術剖析與應用指南 在電子設備的設計中,電源排序對于確保系統的穩(wěn)定運行至關重要。ADM6819和ADM6820作為具有FET驅動能力的簡單電源排序
    的頭像 發(fā)表于 02-28 14:25 ?273次閱讀

    探秘ADM1186:高效電壓監(jiān)測與排序芯片的應用指南

    探秘ADM1186:高效電壓監(jiān)測與排序芯片的應用指南 在電子工程師的日常工作中,電源管理是一個至關重要的環(huán)節(jié)。良好的電源管理不僅能確保設備的穩(wěn)定運行,還能提高系統的可靠性和性能。今天,我們就來深入
    的頭像 發(fā)表于 02-28 14:25 ?262次閱讀

    ADM1066:多功能電源監(jiān)控與排序芯片的深度解析

    ADM1066:多功能電源監(jiān)控與排序芯片的深度解析 在電子設備的設計中,電源的監(jiān)控與排序是確保系統穩(wěn)定運行的關鍵環(huán)節(jié)。ADM1066作為一款功能強大的電源監(jiān)控與排序芯片,為多電源系統提供了全面
    的頭像 發(fā)表于 02-28 14:05 ?213次閱讀

    ADM1068:多功能電源監(jiān)控與排序芯片的深度解析

    ADM1068:多功能電源監(jiān)控與排序芯片的深度解析 在電子系統設計中,電源的監(jiān)控與排序至關重要,它直接關系到系統的穩(wěn)定性和可靠性。今天,我們就來深入探討一款功能強大的電源監(jiān)控與排序芯片
    的頭像 發(fā)表于 02-28 14:05 ?220次閱讀

    LTC2937:六通道電源排序器與電壓監(jiān)控器的設計與應用

    LTC2937:六通道電源排序器與電壓監(jiān)控器的設計與應用 在電子系統設計中,電源管理是至關重要的一環(huán)。合理的電源排序和電壓監(jiān)控能夠確保系統的穩(wěn)定運行,避免因電源問題導致的故障和損壞。今天,我們就來
    的頭像 發(fā)表于 02-28 11:15 ?318次閱讀

    ADM1169:多電源系統的監(jiān)控與排序解決方案

    ADM1169:多電源系統的監(jiān)控與排序解決方案 在電子工程師的日常工作中,多電源系統的監(jiān)控與排序是一個關鍵且復雜的問題。今天要為大家介紹的Analog Devices的ADM1169 Super
    的頭像 發(fā)表于 02-28 11:10 ?294次閱讀

    ADM1166:多電源系統監(jiān)控與排序的理想解決方案

    ADM1166:多電源系統監(jiān)控與排序的理想解決方案 在多電源系統的設計中,對電源的監(jiān)控和排序是至關重要的環(huán)節(jié)。ADM1166作為一款可配置的監(jiān)控/排序設備,為多電源系統的電源監(jiān)控和排序
    的頭像 發(fā)表于 02-28 11:10 ?315次閱讀

    探索LM3880:三軌簡單電源排序器的卓越性能與應用

    探索LM3880:三軌簡單電源排序器的卓越性能與應用 在電子設計領域,電源管理是一個至關重要的環(huán)節(jié)。今天,我們將深入探討德州儀器(TI)推出的LM3880三軌簡單電源排序器,它為多電壓軌的電源排序
    的頭像 發(fā)表于 02-26 17:20 ?641次閱讀

    MAX16050/MAX16051:具備反向排序功能的電壓監(jiān)控與排序電路

    MAX16050/MAX16051:具備反向排序功能的電壓監(jiān)控與排序電路 在電子系統設計中,對電源電壓的精確監(jiān)控和有序控制至關重要。Maxim Integrated推出的MAX16050
    的頭像 發(fā)表于 01-31 17:15 ?955次閱讀

    里可以添加本文要記錄的大

    或降序排列),就如同水中的氣泡最終會上浮到頂端一樣,故名“冒泡排序”。 1.算法描述 1、比較相鄰的元素。如果第一個比第二個大,就進行交換 2、對每一對相鄰元素作同樣操作,從開始第一對到結尾的最后
    發(fā)表于 01-27 22:05

    C語言插入排序算法和代碼

    插入排序排序算法的一種,它不改變原有的序列(數組),而是創(chuàng)建一個新的序列,在新序列上進行操作。   這里以從小到大排序為例進行講解。   基本思想及舉例說明   插入排序
    發(fā)表于 01-15 06:44

    光纖線芯都是按照什么顏色排序

    多次有朋友留言問到,光纖熔接顏色如何排序,這個在實際應用中還是比較多的,那么今天我們就不講原理了,直接用圖文簡單明了講光纖熔接色譜,大家可以了解下。 一、常規(guī)排序 1、4芯的排序:藍、橙、綠、棕
    的頭像 發(fā)表于 12-19 11:02 ?2333次閱讀

    低成本電源排序器解決方案

    絕大多數負載點DC-DC轉換器可以將上一個轉換器的電源就緒輸出連接至下一個轉換器的使能輸入,實現上電排序。這種方法只適合比較簡單的設計,不能滿足多數現代微處理器和DSP的要求一這類器件要求斷電順序必須與上電順序相反。許多廠商針對這類應用推出了可編程排序IC,但器件價格較為
    的頭像 發(fā)表于 05-21 09:55 ?1308次閱讀
    低成本電源<b class='flag-5'>排序</b>器解決方案
    山西省| 鸡东县| 新昌县| 行唐县| 渭源县| 永安市| 永宁县| 冀州市| 武穴市| 筠连县| 芦溪县| 和政县| 甘德县| 桃园市| 行唐县| 井陉县| 宿迁市| 宁德市| 左云县| 白沙| 穆棱市| 松原市| 怀柔区| 屏南县| 乌海市| 且末县| 夏津县| 孟村| 工布江达县| 衡南县| 庄河市| 东乡族自治县| 开化县| 桓台县| 黑龙江省| 孟村| 璧山县| 基隆市| 濮阳市| 稷山县| 丹巴县|