C++實(shí)現(xiàn)雙向冒泡排序算法
本文實(shí)例為大家分享了C++實(shí)現(xiàn)雙向冒泡排序算法的具體代碼,供大家參考,具體內(nè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ì)越來越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對(duì)數(shù)字需要比較。
雙向冒泡算法原理
雙向冒泡排序算法的運(yùn)作如下:
1.傳統(tǒng)冒泡氣泡排序的雙向進(jìn)行,先讓氣泡排序由左向右進(jìn)行,再來讓氣泡排序由右往左進(jìn)行,如此完成一次排序的動(dòng)作
2.使用left與right兩個(gè)旗標(biāo)來記錄左右兩端已排序的元素位置。
一個(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/C++?Qt數(shù)據(jù)庫與SqlTableModel組件應(yīng)用教程
SqlTableModel?組件可以將數(shù)據(jù)庫中的特定字段動(dòng)態(tài)顯示在TableView表格組件中,這篇文章將主要介紹SqlTableModel組件一些常用的操作,需要的朋友可以參考一下2021-12-12
C語言堆與二叉樹的順序結(jié)構(gòu)與實(shí)現(xiàn)
堆是計(jì)算機(jī)科學(xué)中一類特殊的數(shù)據(jù)結(jié)構(gòu)的統(tǒng)稱,通常是一個(gè)可以被看做一棵完全二叉樹的數(shù)組對(duì)象。而堆排序是利用堆這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計(jì)的一種排序算法。本文將詳細(xì)介紹堆與二叉樹的順序結(jié)構(gòu)與實(shí)現(xiàn),需要的可以參考一下2022-05-05
基于Matlab LBP實(shí)現(xiàn)植物葉片識(shí)別功能
局部二值模式(LBP)是由Ojala等人于2002年提出,它被用于特征提取,而且提取的特征是圖像的紋理特征。本文將利用Matlab和LBP實(shí)現(xiàn)植物葉片識(shí)別,需要的可以參考一下2022-02-02
C語言實(shí)現(xiàn)簡(jiǎn)單的猜數(shù)字游戲
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)簡(jiǎn)單的猜數(shù)字游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
C++計(jì)算整數(shù)序列的最長遞增子序列的長度操作
這篇文章主要介紹了C++計(jì)算整數(shù)序列的最長遞增子序列的長度操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12
C++實(shí)現(xiàn)十進(jìn)制數(shù)轉(zhuǎn)為其它進(jìn)制數(shù)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)十進(jìn)制數(shù)轉(zhuǎn)為其它進(jìn)制數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04
C語言實(shí)現(xiàn)經(jīng)典windows游戲掃雷的示例代碼
今天我們會(huì)用C語言實(shí)現(xiàn)一個(gè)經(jīng)典的windows小游戲:掃雷。掃雷是一款單機(jī)小游戲,每次通關(guān)最高難度的關(guān)卡都會(huì)開心好一陣。現(xiàn)在學(xué)會(huì)了C語言,總算可以自己實(shí)現(xiàn)掃雷了。話不多說,咱們開始吧2022-10-10

