C++實(shí)現(xiàn)雙向冒泡排序算法
本文實(shí)例為大家分享了C++實(shí)現(xiàn)雙向冒泡排序算法的具體代碼,供大家參考,具體內(nèi)容如下
一、概念(來(lái)源于百度百科)
傳統(tǒng)冒泡算法原理
冒泡排序算法的運(yùn)作如下:(從后往前)
1.比較相鄰的元素。如果第一個(gè)比第二個(gè)大,就交換他們兩個(gè)。
2.對(duì)每一對(duì)相鄰元素作同樣的工作,從開始第一對(duì)到結(jié)尾的最后一對(duì)。在這一點(diǎn),最后的元素應(yīng)該會(huì)是最大的數(shù)。
3.針對(duì)所有的元素重復(fù)以上的步驟,除了最后一個(gè)。
4.持續(xù)每次對(duì)越來(lái)越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對(duì)數(shù)字需要比較。
雙向冒泡算法原理
雙向冒泡排序算法的運(yùn)作如下:
1.傳統(tǒng)冒泡氣泡排序的雙向進(jìn)行,先讓氣泡排序由左向右進(jìn)行,再來(lái)讓氣泡排序由右往左進(jìn)行,如此完成一次排序的動(dòng)作
2.使用left與right兩個(gè)旗標(biāo)來(lái)記錄左右兩端已排序的元素位置。
一個(gè)排序的例子如下所示:
排序前:45 19 77 81 13 28 18 19 77 11
往右排序:19 45 77 13 28 18 19 77 11 [81]
向左排序:[11] 19 45 77 13 28 18 19 77 [81]
往右排序:[11] 19 45 13 28 18 19 [77 77 81]
向左排序:[11 13] 19 45 18 28 19 [77 77 81]
往右排序:[11 13] 19 18 28 19 [45 77 77 81]
向左排序:[11 13 18] 19 19 28 [45 77 77 81]
往右排序:[11 13 18] 19 19 [28 45 77 77 81]
向左排序:[11 13 18 19 19] [28 45 77 77 81]
如上所示,括號(hào)中表示左右兩邊已排序完成的部份,當(dāng)left >= right時(shí),則排序完成。
二、實(shí)現(xiàn)程序:
#include <iostream> #include <ctime> const int MAX = 30; // 交換兩個(gè)數(shù) void Swap(int &x, int &y) { int temp; temp = x; x = y; y = temp; } // 雙向冒泡排序 void twoBubbleSort(int arr[], int len) { int left, right, shift, i; // shift為記錄左右兩端已排序的元素位置 left = 0; right = len - 1; shift = 1; while(left < right) { // 往右排序 for(i = left; i < right; i++) { if(arr[i] > arr[i+1]) { // 第一個(gè)數(shù)比第二個(gè)數(shù)大,交換 Swap(arr[i], arr[i+1]); shift = i; } } right = shift; for(i = right-1; i >= left; i--) { // 向左排序 if(arr[i] > arr[i+1]) { // 第一個(gè)數(shù)比第二個(gè)數(shù)大,交換 Swap(arr[i], arr[i+1]); shift = i + 1; } } left = shift; } } int main(int argc, const char * argv[]) { // insert code here... int arr[MAX], i; srand((int)time(NULL)); // 設(shè)置時(shí)間為隨機(jī)點(diǎn) std::cout << "排序前:"; for(i = 0; i < MAX; i++) { arr[i] = rand() % 100; std::cout << arr[i] << " "; } // 調(diào)用雙向冒泡排序函數(shù) twoBubbleSort(arr, MAX); std::cout << "\n排序后:"; for(i = 0; i < MAX; i++) std::cout << arr[i] << " "; std::cout << std::endl; return 0; }
運(yùn)行結(jié)果:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
c++11中關(guān)于std::thread的join的詳解
這篇文章主要介紹了c++11中關(guān)于std::thread的join詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03C語(yǔ)言中qsort函數(shù)的用法實(shí)例詳解
這篇文章主要介紹了C語(yǔ)言中qsort函數(shù)的用法實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下2017-10-10C++使用一棵紅黑樹同時(shí)封裝出map和set實(shí)例代碼
紅黑樹(Red?Black?Tre)是一種自平衡二叉查找樹,是在計(jì)算機(jī)科學(xué)中用到的一種數(shù)據(jù)結(jié)構(gòu),典型的用途是實(shí)現(xiàn)關(guān)聯(lián)數(shù)組,下面這篇文章主要給大家介紹了關(guān)于C++使用一棵紅黑樹同時(shí)封裝出map和set的相關(guān)資料,需要的朋友可以參考下2023-04-04C語(yǔ)言進(jìn)階教程之字符函數(shù)和字符串函數(shù)
C語(yǔ)言中對(duì)字符和字符串的處理很是頻繁,但是C語(yǔ)言本身是沒有字符串類型的,字符串通常放在常量字符串中或者字符數(shù)組中,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言進(jìn)階教程之字符函數(shù)和字符串函數(shù)的相關(guān)資料,需要的朋友可以參考下2022-11-11C語(yǔ)言實(shí)現(xiàn)掃雷小游戲完整算法詳解(附完整代碼)
掃雷游戲想必我們都有玩過,那么今天就用C語(yǔ)言來(lái)簡(jiǎn)單實(shí)現(xiàn)“掃雷”小游戲,這篇文章主要給大家介紹了關(guān)于C語(yǔ)言實(shí)現(xiàn)掃雷小游戲完整算法的相關(guān)資料,文中給出了完整的實(shí)例代碼,需要的朋友可以參考下2022-06-06c++將引用或者是指針作為函數(shù)參數(shù)實(shí)現(xiàn)實(shí)參的運(yùn)算
這篇文章主要介紹了c++將引用或者是指針作為函數(shù)參數(shù)實(shí)現(xiàn)實(shí)參的運(yùn)算,需要的朋友可以參考下2014-05-05C++實(shí)現(xiàn)的多重繼承功能簡(jiǎn)單示例
這篇文章主要介紹了C++實(shí)現(xiàn)的多重繼承功能,結(jié)合簡(jiǎn)單實(shí)例形式分析了C++面向?qū)ο蟪绦蛟O(shè)計(jì)中類的定義與繼承相關(guān)操作實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-05-05C++中的Lambda表達(dá)式及表達(dá)式語(yǔ)句
這篇文章主要介紹了C++中的Lambda表達(dá)式及表達(dá)式語(yǔ)句,表達(dá)式這個(gè)概念在C++中屬于比較細(xì)節(jié)的知識(shí)了,很多時(shí)候我們只用知道怎么用,對(duì)于編譯器內(nèi)部怎么處理我們并不關(guān)心;并且關(guān)于左值和右值這個(gè)概念,也是C++比較深的一個(gè)小知識(shí)點(diǎn),需要的朋友可以參考一下2021-12-12