最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言對(duì)數(shù)組元素進(jìn)行冒泡排序的實(shí)現(xiàn)

 更新時(shí)間:2021年02月04日 10:41:05   投稿:zx  
這篇文章主要介紹了C語(yǔ)言對(duì)數(shù)組元素進(jìn)行冒泡排序的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

在實(shí)際開(kāi)發(fā)中,有很多場(chǎng)景需要我們將數(shù)組元素按照從大到?。ɑ蛘邚男〉酱螅┑捻樞蚺帕?,這樣在查閱數(shù)據(jù)時(shí)會(huì)更加直觀,例如:

  • 一個(gè)保存了班級(jí)學(xué)號(hào)的數(shù)組,排序后更容易分區(qū)好學(xué)生和壞學(xué)生;
  • 一個(gè)保存了商品單價(jià)的數(shù)組,排序后更容易看出它們的性價(jià)比。

對(duì)數(shù)組元素進(jìn)行排序的方法有很多種,比如冒泡排序、歸并排序、選擇排序、插入排序、快速排序等,其中最經(jīng)典最需要掌握的是「冒泡排序」。

以從小到大排序?yàn)槔?,冒泡排序的整體思想是這樣的:

  • 從數(shù)組頭部開(kāi)始,不斷比較相鄰的兩個(gè)元素的大小,讓較大的元素逐漸往后移動(dòng)(交換兩個(gè)元素的值),直到數(shù)組的末尾。經(jīng)過(guò)第一輪的比較,就可以找到最大的元素,并將它移動(dòng)到最后一個(gè)位置。
  • 第一輪結(jié)束后,繼續(xù)第二輪。仍然從數(shù)組頭部開(kāi)始比較,讓較大的元素逐漸往后移動(dòng),直到數(shù)組的倒數(shù)第二個(gè)元素為止。經(jīng)過(guò)第二輪的比較,就可以找到次大的元素,并將它放到倒數(shù)第二個(gè)位置。
  • 以此類推,進(jìn)行 n-1(n 為數(shù)組長(zhǎng)度)輪“冒泡”后,就可以將所有的元素都排列好。

整個(gè)排序過(guò)程就好像氣泡不斷從水里冒出來(lái),最大的先出來(lái),次大的第二出來(lái),最小的最后出來(lái),所以將這種排序方式稱為冒泡排序(Bubble Sort)。

下面我們以“3  2  4  1”為例對(duì)冒泡排序進(jìn)行說(shuō)明。

第一輪  排序過(guò)程
3  2  4  1    (最初)
2  3  4  1    (比較3和2,交換)
2  3  4  1    (比較3和4,不交換)
2  3  1  4    (比較4和1,交換)
第一輪結(jié)束,最大的數(shù)字 4 已經(jīng)在最后面,因此第二輪排序只需要對(duì)前面三個(gè)數(shù)進(jìn)行比較。

第二輪  排序過(guò)程
2  3  1  4 (第一輪排序結(jié)果)
2  3  1  4 (比較2和3,不交換)
2  1  3  4 (比較3和1,交換)
第二輪結(jié)束,次大的數(shù)字 3 已經(jīng)排在倒數(shù)第二個(gè)位置,所以第三輪只需要比較前兩個(gè)元素。

第三輪  排序過(guò)程
2  1  3  4  (第二輪排序結(jié)果)
1  2  3  4  (比較2和1,交換)

至此,排序結(jié)束。

算法總結(jié)及實(shí)現(xiàn)

對(duì)擁有 n 個(gè)元素的數(shù)組 R[n] 進(jìn)行 n-1 輪比較。

第一輪,逐個(gè)比較 (R[1], R[2]),  (R[2], R[3]),  (R[3], R[4]),  …….  (R[N-1], R[N]),最大的元素被移動(dòng)到 R[n] 上。

第二輪,逐個(gè)比較 (R[1], R[2]),  (R[2], R[3]),  (R[3], R[4]),  …….  (R[N-2], R[N-1]),次大的元素被移動(dòng)到 R[n-1] 上。
。。。。。。
以此類推,直到整個(gè)數(shù)組從小到大排序。

具體的代碼實(shí)現(xiàn)如下所示:

#include <stdio.h>
int main(){
  int nums[10] = {4, 5, 2, 10, 7, 1, 8, 3, 6, 9};
  int i, j, temp;
  //冒泡排序算法:進(jìn)行 n-1 輪比較
  for(i=0; i<10-1; i++){
    //每一輪比較前 n-1-i 個(gè),也就是說(shuō),已經(jīng)排序好的最后 i 個(gè)不用比較
    for(j=0; j<10-1-i; j++){
      if(nums[j] > nums[j+1]){
        temp = nums[j];
        nums[j] = nums[j+1];
        nums[j+1] = temp;
      }
    }
  }
  
  //輸出排序后的數(shù)組
  for(i=0; i<10; i++){
    printf("%d ", nums[i]);
  }
  printf("\n");
  
  return 0;
}

運(yùn)行結(jié)果:
1 2 3 4 5 6 7 8 9 10

優(yōu)化算法

上面的算法是大部分教材中提供的算法,其中有一點(diǎn)是可以優(yōu)化的:當(dāng)比較到第 i 輪的時(shí)候,如果剩下的元素已經(jīng)排序好了,那么就不用再繼續(xù)比較了,跳出循環(huán)即可,這樣就減少了比較的次數(shù),提高了執(zhí)行效率。

未經(jīng)優(yōu)化的算法一定會(huì)進(jìn)行 n-1 輪比較,經(jīng)過(guò)優(yōu)化的算法最多進(jìn)行 n-1 輪比較,高下立判。

優(yōu)化后的算法實(shí)現(xiàn)如下所示:

#include <stdio.h>
int main(){
  int nums[10] = {4, 5, 2, 10, 7, 1, 8, 3, 6, 9};
  int i, j, temp, isSorted;
  
  //優(yōu)化算法:最多進(jìn)行 n-1 輪比較
  for(i=0; i<10-1; i++){
    isSorted = 1; //假設(shè)剩下的元素已經(jīng)排序好了
    for(j=0; j<10-1-i; j++){
      if(nums[j] > nums[j+1]){
        temp = nums[j];
        nums[j] = nums[j+1];
        nums[j+1] = temp;
        isSorted = 0; //一旦需要交換數(shù)組元素,就說(shuō)明剩下的元素沒(méi)有排序好
      }
    }
    if(isSorted) break; //如果沒(méi)有發(fā)生交換,說(shuō)明剩下的元素已經(jīng)排序好了
  }
  for(i=0; i<10; i++){
    printf("%d ", nums[i]);
  }
  printf("\n");
  
  return 0;
}

我們額外設(shè)置了一個(gè)變量 isSorted,用它作為標(biāo)志,值為“真”表示剩下的元素已經(jīng)排序好了,值為“假”表示剩下的元素還未排序好。

每一輪比較之前,我們預(yù)先假設(shè)剩下的元素已經(jīng)排序好了,并將 isSorted 設(shè)置為“真”,一旦在比較過(guò)程中需要交換元素,就說(shuō)明假設(shè)是錯(cuò)的,剩下的元素沒(méi)有排序好,于是將 isSorted 的值更改為“假”。

每一輪循環(huán)結(jié)束后,通過(guò)檢測(cè) isSorted 的值就知道剩下的元素是否排序好。

到此這篇關(guān)于C語(yǔ)言對(duì)數(shù)組元素進(jìn)行冒泡排序的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C語(yǔ)言數(shù)組冒泡排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Qt實(shí)現(xiàn)矩形大小任意縮放的示例代碼

    Qt實(shí)現(xiàn)矩形大小任意縮放的示例代碼

    這篇文章主要介紹了Qt如何實(shí)現(xiàn)在窗口上繪制任意大小的矩形,并且通過(guò)邊角的拖曳按鈕可改變矩形大小,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-06-06
  • C語(yǔ)言深入探究冒泡排序與堆排序使用案例講解

    C語(yǔ)言深入探究冒泡排序與堆排序使用案例講解

    算法中排序是十分重要的,而每一個(gè)學(xué)習(xí)計(jì)算機(jī)的都會(huì)在初期的時(shí)候接觸到這種排序,下面這篇文章主要給大家介紹了關(guān)于c語(yǔ)言冒泡排序與堆排序使用的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • 深入理解C++的對(duì)象模型

    深入理解C++的對(duì)象模型

    本文在介紹C++使用的對(duì)象模型之前,先介紹了2種對(duì)象模型:簡(jiǎn)單對(duì)象模型(a simple object model)和表格驅(qū)動(dòng)對(duì)象模型(a table-driven object model),這樣介紹對(duì)后面的內(nèi)容更有幫助,有需要的小伙伴們可以參考學(xué)習(xí)。
    2016-08-08
  • C++實(shí)現(xiàn)LeetCode(117.每個(gè)節(jié)點(diǎn)的右向指針之二)

    C++實(shí)現(xiàn)LeetCode(117.每個(gè)節(jié)點(diǎn)的右向指針之二)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(117.每個(gè)節(jié)點(diǎn)的右向指針之二),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語(yǔ)言 字符串指針詳解及示例代碼

    C語(yǔ)言 字符串指針詳解及示例代碼

    本文主要介紹C語(yǔ)言 字符串指針,這里整理了詳細(xì)資料,并附示例代碼及實(shí)現(xiàn)結(jié)果,有興趣的小伙伴可以參考下
    2016-08-08
  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能(2)

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能(2)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能的第二部分,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • VC++文件監(jiān)控之FindFirstChangeNotification

    VC++文件監(jiān)控之FindFirstChangeNotification

    因?yàn)镽eadDirectoryChangesW 上次測(cè)試發(fā)現(xiàn)不能多級(jí)目錄監(jiān)控,所以嘗試用FindFirstChangeNotification來(lái)實(shí)施文件監(jiān)控,需要的朋友可以參考下
    2019-04-04
  • C++里最容易忽視卻不能忽視的問(wèn)題(必看)

    C++里最容易忽視卻不能忽視的問(wèn)題(必看)

    在C++里最容易忽視卻不能忽視的問(wèn)題都有哪些呢?下面小編就為大家介紹一下。一起跟隨小編過(guò)來(lái)看看吧
    2016-05-05
  • 淺談Qt中使用CEF的幾個(gè)要點(diǎn)(Windows下)

    淺談Qt中使用CEF的幾個(gè)要點(diǎn)(Windows下)

    下面小編就為大家?guī)?lái)一篇淺談Qt中使用CEF的幾個(gè)要點(diǎn)(Windows下)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • C++實(shí)現(xiàn)保存數(shù)據(jù)至EXCEL

    C++實(shí)現(xiàn)保存數(shù)據(jù)至EXCEL

    這篇文章主要介紹了C++實(shí)現(xiàn)保存數(shù)據(jù)至EXCEL,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11

最新評(píng)論

政和县| 昭平县| 双桥区| 剑川县| 崇义县| 腾冲县| 龙陵县| 张家界市| 秦皇岛市| 福泉市| 思茅市| 湘潭县| 北安市| 贵南县| 山东省| 利辛县| 黄大仙区| 景泰县| 刚察县| 清徐县| 通江县| 南雄市| 额济纳旗| 蓬安县| 井陉县| 遵义市| 山东| 乡城县| 乌兰察布市| 涞源县| 民县| 镇雄县| 新巴尔虎右旗| 武邑县| 淮北市| 宕昌县| 海宁市| 仙桃市| 威海市| 梁河县| 阿荣旗|