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

C語(yǔ)言實(shí)現(xiàn)數(shù)組元素排序方法詳解

 更新時(shí)間:2023年02月11日 10:45:50   作者:Elanie1024  
這篇文章主要為大家介紹了C語(yǔ)言算法練習(xí)中數(shù)組元素排序的實(shí)現(xiàn)方法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C語(yǔ)言有一定幫助,需要的可以參考一下

前言

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

  • 一個(gè)保存了班級(jí)學(xué)號(hào)的數(shù)組,排序后更容易分區(qū)好學(xué)生和壞學(xué)生;
  • 一個(gè)保存了商品單價(jià)的數(shù)組,排序后更容易看出它們的性?xún)r(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è)位置。
  • 以此類(lèi)推,進(jìn)行 n-1(n 為數(shù)組長(zhǎng)度)輪“冒泡”后,就可以將所有的元素都排列好。

整個(gè)排序過(guò)程就好像氣泡不斷從水里冒出來(lái),最大的先出來(lái),次大的第二出來(lái),最小的最后出來(lái),所以將這種排序方式稱(chēng)為冒泡排序(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] 上。

以此類(lèi)推,直到整個(gè)數(shù)組從小到大排序。

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

#include<stdio.h>
intmain(){
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");
return0;
}

運(yùn)行結(jié)果:

1 2 3 4 5 6 7 8 9 10

優(yōu)化算法

上面的算法是大部分教材中提供的算法,其中有一點(diǎn)是可以?xú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>
intmain(){
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");
return0;
}

我們額外設(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ǔ)言實(shí)現(xiàn)數(shù)組元素排序方法詳解的文章就介紹到這了,更多相關(guān)C語(yǔ)言數(shù)組元素排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 素?cái)?shù)判定算法的實(shí)現(xiàn)

    素?cái)?shù)判定算法的實(shí)現(xiàn)

    這篇文章主要介紹了素?cái)?shù)判定算法的實(shí)現(xiàn),素?cái)?shù)判定問(wèn)題是一個(gè)非常常見(jiàn)的問(wèn)題,本文介紹了常用的幾種判定方法,需要的朋友可以參考下
    2014-08-08
  • 基于QT繪制一個(gè)漂亮的預(yù)警儀表

    基于QT繪制一個(gè)漂亮的預(yù)警儀表

    這篇文章主要為大家詳細(xì)介紹了如何基于QT繪制一個(gè)漂亮的預(yù)警儀表,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的可以了解一下
    2023-04-04
  • 圖解C++的STL之stack和queue,輕松理解數(shù)據(jù)結(jié)構(gòu)

    圖解C++的STL之stack和queue,輕松理解數(shù)據(jù)結(jié)構(gòu)

    聚焦?C++?的?STL?中的?stack?和?queue,讓數(shù)據(jù)結(jié)構(gòu)變得簡(jiǎn)單有趣!?通過(guò)圖解的方式,我們將輕松理解這兩個(gè)重要的數(shù)據(jù)結(jié)構(gòu),準(zhǔn)備好開(kāi)啟?STL?學(xué)習(xí)之旅了嗎?讓我們一起探索?stack?和?queue?的奧秘吧!
    2024-03-03
  • C++基于Boost.Asio實(shí)現(xiàn)端口映射器的過(guò)程詳解

    C++基于Boost.Asio實(shí)現(xiàn)端口映射器的過(guò)程詳解

    Boost.Asio 是一個(gè)功能強(qiáng)大的 C++ 庫(kù),用于異步編程和網(wǎng)絡(luò)編程,它提供了跨平臺(tái)的異步 I/O 操作,在這篇文章中,我們將深入分析一個(gè)使用 Boost.Asio 實(shí)現(xiàn)的簡(jiǎn)單端口映射服務(wù)器,文中有詳細(xì)的代碼講解,需要的朋友可以參考下
    2023-11-11
  • C語(yǔ)言 從根本上理解數(shù)組

    C語(yǔ)言 從根本上理解數(shù)組

    數(shù)組是一組有序的數(shù)據(jù)的集合,數(shù)組中元素類(lèi)型相同,由數(shù)組名和下標(biāo)唯一地確定,數(shù)組中數(shù)據(jù)不僅數(shù)據(jù)類(lèi)型相同,而且在計(jì)算機(jī)內(nèi)存里連續(xù)存放,地址編號(hào)最低的存儲(chǔ)單元存放數(shù)組的起始元素,地址編號(hào)最高的存儲(chǔ)單元存放數(shù)組的最后一個(gè)元素
    2022-04-04
  • 解析C語(yǔ)言結(jié)構(gòu)體及位段

    解析C語(yǔ)言結(jié)構(gòu)體及位段

    今天小編就為大家分享一篇關(guān)于解析C語(yǔ)言結(jié)構(gòu)體及位段,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • C語(yǔ)言實(shí)現(xiàn)流星雨效果流程

    C語(yǔ)言實(shí)現(xiàn)流星雨效果流程

    C本篇文章帶你用C語(yǔ)言去實(shí)現(xiàn)漫天流星雨的效果,代碼寫(xiě)的很清晰,效果非常棒,另有視頻詳解整個(gè)過(guò)程,相信你一定能看懂,感興趣的童鞋快來(lái)看看吧
    2021-11-11
  • C++中自定義sleep、條件變量sleep實(shí)例

    C++中自定義sleep、條件變量sleep實(shí)例

    這篇文章主要介紹了C++中自定義sleep、條件變量sleep實(shí)例,本文直接給出實(shí)例代碼并講解了功能作用和使用方法,需要的朋友可以參考下
    2015-03-03
  • C++內(nèi)存管理面經(jīng)

    C++內(nèi)存管理面經(jīng)

    這篇文章主要介紹了C++的內(nèi)存分配方式以及介紹了下棧和堆的區(qū)別,感興趣的小伙伴可以參考閱讀本文
    2023-03-03
  • C++中默認(rèn)無(wú)參構(gòu)造函數(shù)的工作機(jī)制淺析

    C++中默認(rèn)無(wú)參構(gòu)造函數(shù)的工作機(jī)制淺析

    構(gòu)造函數(shù)主要作用在于創(chuàng)建對(duì)象時(shí)為對(duì)象的成員屬性賦值,構(gòu)造函數(shù)由編譯器自動(dòng)調(diào)用,無(wú)須手動(dòng)調(diào)用;析構(gòu)函數(shù)主要作用在于對(duì)象銷(xiāo)毀前系統(tǒng)自動(dòng)調(diào)用,執(zhí)行一些清理工作
    2023-02-02

最新評(píng)論

门头沟区| 铜鼓县| 册亨县| 兴山县| 上杭县| 齐齐哈尔市| 池州市| 宜丰县| 石泉县| 汽车| 仪陇县| 无为县| 临漳县| 新化县| 磐安县| 永昌县| 文登市| 临汾市| 嘉兴市| 孝昌县| 柘城县| 南溪县| 扎赉特旗| 盐边县| 安顺市| 镇坪县| 岳池县| 临武县| 宿州市| 北京市| 大港区| 德令哈市| 阿尔山市| 葵青区| 深水埗区| 祁连县| 银川市| 兰西县| 湖州市| 临潭县| 余江县|