關(guān)于數(shù)組的使用和幾種排序方式的寫(xiě)法

目的

昨天我們學(xué)習(xí)了數(shù)組枫浙,今天當(dāng)然是使用數(shù)組來(lái)寫(xiě)一些東西啦!當(dāng)然今天還學(xué)習(xí)了用幾種排序方式來(lái)進(jìn)行一些數(shù)的從大到小的排序狼牺。那么今天我們要怎么用這兩個(gè)知識(shí)點(diǎn)來(lái)寫(xiě)一個(gè)什么樣的程序呢?盡情期待!J焱琛!

幾種排序的方式

1.冒泡排序法
冒泡排序法是我之前還算記得牢靠的一種排列數(shù)字的方法伪节,顧名思義光羞,它的意思就是讓一個(gè)較大的元素通過(guò)“冒泡”的方式讓其漸漸的“浮”到數(shù)組的最后。
算法原理:
1.比較相鄰的元素怀大。如果第一個(gè)比第二個(gè)大纱兑,就交換他們兩個(gè)。
2.對(duì)每一對(duì)相鄰元素作同樣的工作化借,從開(kāi)始第一對(duì)到結(jié)尾的最后一對(duì)潜慎。在這一點(diǎn),最后數(shù)組的元素應(yīng)該會(huì)是最大的數(shù)屏鳍。
3.針對(duì)所有的元素重復(fù)以上的步驟勘纯,除了最后一個(gè)。
4.持續(xù)每次對(duì)越來(lái)越少的元素重復(fù)上面的步驟钓瞭,直到?jīng)]有任何一對(duì)數(shù)字需要比較
代碼實(shí)現(xiàn):

int main(int argc, const char * argv[]) {
    int num[] = {3,0,1,8,7,2,5,4,6,9};
    
    for (int i = 0; i < 10; i++){//比較的次數(shù)
        for (int j = 0; j < 10-i-1; j++){
            if (num[j] > num[j+1]) {
                //交換j和j+1的值
                int temp = num[j+1];
                num[j+1] = num[j];
                num[j] = temp;
            }
        }
    }
 for (int i = 0; i < 10; i++) {
        printf("%d ", num[i]);
    }
    printf("\n");
    return 0;
}

2.選擇排序法
選擇排序就是要一組數(shù)中選出最大(最胁底瘛)的數(shù)然后將其放在第一位;然后找出剩下的數(shù)中找出第二大(猩轿小)的數(shù)放在第二位堤结;以此類推。最后就可以得到一組數(shù)的排序鸭丛。
算法原理:
1.對(duì)比數(shù)組中前一個(gè)元素跟后一個(gè)元素的大小竞穷,如果后面的元素比前面的元素小則用一個(gè)變量k來(lái)記住他的位置。
2.對(duì)每一對(duì)相鄰元素作同樣的工作鳞溉。從開(kāi)始第一對(duì)到結(jié)尾的最后一對(duì)瘾带。在這一點(diǎn),最后我們會(huì)得到最小的數(shù)的位置熟菲。
3.然后進(jìn)行判斷看政,如果這個(gè)元素不是第一個(gè)元素,就讓第一個(gè)元素跟他交換一下值抄罕,這樣就找到整個(gè)數(shù)組中最小的數(shù)了允蚣。
4.然后找到數(shù)組中第二小的數(shù),讓他跟數(shù)組中第二個(gè)元素交換一下值呆贿,以此類推嚷兔。
代碼實(shí)現(xiàn):

int main(int argc, const char * argv[]) {
    int num[] = {3,0,1,8,7,2,5,4,6,9};

  for (int i = 0; i < 10-1; i++){
        //默認(rèn)這是最小的
        //int min = num[i];//3
        for (int j = i+1; j < 10; j++){
            //控制用min和后面的每一個(gè)進(jìn)行比較
            if (num[i] > num[j]){
                //j對(duì)應(yīng)的數(shù)字比min還小 交換
                int temp = num[i];
                num[i] = num[j];
                num[j] = temp;
            }
        }
        //一次遍歷之后找到最小的值min
        //num[i] = min;
    }
 for (int i = 0; i < 10; i++) {
        printf("%d ", num[i]);
    }
    printf("\n");
    return 0;
}

3.插入排序法
其目的就是每一步都將一個(gè)待排數(shù)據(jù)按其大小插入到已經(jīng)排序的數(shù)據(jù)中的適當(dāng)位置,直到全部插入完畢。
算法實(shí)現(xiàn) :
1.選擇序列的第一個(gè)元素作為有序序列冒晰;
2.將后面的一個(gè)元素插入到前面的有序數(shù)列中同衣,以此類推。最后得到排序好的數(shù)列壶运。

int main(int argc, const char * argv[]) {
    int num[] = {3,0,1,8,7,2,5,4,6,9};
  for (int i = 0; i < 10; i++) {
        //讓i和i+1比較大小
        if (num[i] > num[i+1]) {
            //交換值
            int temp = num[i];
            num[i] = num[i+1];
            num[i+1] = temp;
            
            //讓num[i]和前面的所有進(jìn)行比較
            for (int j = i; j > 0; j--){
                if (num[j] < num[j-1]) {
                    temp = num[j];
                    num[j] = num[j-1];
                    num[j-1] = temp;
                }
            }
        }
    }
    
    for (int i = 0; i < 10; i++) {
        printf("%d ", num[i]);
    }
    printf("\n");
    return 0;
}

實(shí)際使用

那么現(xiàn)在就來(lái)到了寫(xiě)代碼的環(huán)節(jié)了乳怎,今天我們寫(xiě)了兩個(gè)很有意思的代碼
1.“殺人”游戲
這個(gè)游戲就是將一群人圍成一圈編號(hào)比如7個(gè)人,繞著圈依次喊1前弯,2,3秫逝,當(dāng)有人喊到3時(shí)這個(gè)人退出游戲恕出,下一個(gè)重新喊1,2违帆,3浙巫,直到只剩下一個(gè)人
具體代碼實(shí)現(xiàn)

#include<stdio.h>
#include<iostream>
#define KILL -1
int main()
{
    int total;
    int killNumber;
    int a[100];
    int count=0;
    printf("請(qǐng)輸入玩游戲的人數(shù):");
    scanf_s("%d", &total);
    printf("請(qǐng)輸入死亡編號(hào):");
    scanf_s("%d", &killNumber);
    for (int i = 0; i < total; i++)
    {
        a[i] = i + 1;
    }
    int number = 0;
    for (int i = 0; i < total; i++)
    {
        if (a[i] != KILL)
        {
            number++;
            if (number == killNumber)
            {
                a[i] =KILL;
                count++;
                if (count == total - 1)
                {
                    break;
                }
                number = 0;
            }
        }
        if (i == total - 1)
        {
            i = -1;
        }
    }
    for (int i = 0; i < total; i++)
    {
        if (a[i] != KILL)
            printf("%d",a[i]);
    }
    system("pause");
    return 0;
}

2.第二個(gè)游戲
猜數(shù)字游戲;系統(tǒng)自動(dòng)生成按大小排序不重復(fù)的4個(gè)數(shù)刷后;自己輸入4個(gè)數(shù)的畴,然后進(jìn)行比較,如果位置對(duì)數(shù)字對(duì)輸出一個(gè)A如果數(shù)字對(duì)位置不對(duì)輸出B尝胆,根據(jù)系統(tǒng)提示輸入下一組數(shù)丧裁,直到全對(duì),結(jié)束游戲含衔。

#include<stdio.h>
#include<iostream>
#include"stdlib.h"
#include"time.h"http:// 含有隨機(jī)數(shù)函數(shù)的頭文件
void initArray(int array[]);
int main()
{
    int array[4];
    int myArray[4];
    int countA = 0;
    int countB = 0;
    initArray(array);
    for (int i = 0; i < 4; i++)
    {
        printf("%d ", array[i]);
    }
    while (1)
    {
        printf("輸入數(shù)字:");
        for (int i = 0; i < 4; i++)
        {
            scanf_s("%d", &myArray[i]);
        }
        for (int i = 0; i < 4; i++)
        {
            for (int j = 0; j < 4; j++)
            {
                if (myArray[j] == array[i])
                {
                    if (i == j)
                    {
                        countA++;
                    }
                    else
                    {
                        countB++;
                    }
                }
            }
        }
        if (countA == 4)
        {
            printf("恭喜<褰俊!L叭尽缓呛!");
            break;
        }
        else {
            printf("%dA%dB", countA, countB);
            countA = 0;
            countB = 0;
        }
    }
    system("pause");
    return 0;
}
void initArray(int array[]) {
    srand((unsigned int)time(NULL)*10);//重置種子
    for (int i = 0; i < 4; i++) {
        int temp = 0;
        bool isExist = false;
        while (1) {
            //產(chǎn)生一個(gè)隨機(jī)數(shù)
            temp = rand() % 10;
            //1 2 3
            //判斷這個(gè)數(shù)字在數(shù)組里面是否存在
            //i表示當(dāng)前數(shù)組里面已經(jīng)存進(jìn)去幾個(gè)了
            for (int j = 0; j < i; j++) {
                if (array[j] == temp) {
                    //存在了
                    isExist = true;
                    break;
                }
            }
            //什么情況下出來(lái)
            //1.break 2.遍歷完畢還沒(méi)找到相同
            if (isExist == false) {
                break;
            }
        }
        //將這個(gè)隨機(jī)數(shù)添加到數(shù)組里面
        array[i] = temp;
        //進(jìn)行大小排序
        for (int k = i; k > 0; k--)
        {
            if (array[k] <= array[k - 1])
            {
                int t;
                t = array[k];
                array[k] = array[k - 1];
                array[k - 1] = t;
            }
        }
    }
}

寫(xiě)在后面

可以看到在這兩個(gè)程序里面用了較多的排序,我們?cè)谂判驎r(shí)一定要注意循環(huán)是要遍歷整個(gè)數(shù)組杭隙;明白什么時(shí)候結(jié)束程序哟绊;在寫(xiě)排序程序時(shí)可以先再別的地方搞清楚如何循環(huán),再下手編寫(xiě)痰憎。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末票髓,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子信殊,更是在濱河造成了極大的恐慌炬称,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涡拘,死亡現(xiàn)場(chǎng)離奇詭異玲躯,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門跷车,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)棘利,“玉大人,你說(shuō)我怎么就攤上這事朽缴∩泼担” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵密强,是天一觀的道長(zhǎng)茅郎。 經(jīng)常有香客問(wèn)我,道長(zhǎng)或渤,這世上最難降的妖魔是什么系冗? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮薪鹦,結(jié)果婚禮上掌敬,老公的妹妹穿的比我還像新娘。我一直安慰自己池磁,他們只是感情好奔害,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著地熄,像睡著了一般华临。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上端考,一...
    開(kāi)封第一講書(shū)人閱讀 51,462評(píng)論 1 302
  • 那天银舱,我揣著相機(jī)與錄音,去河邊找鬼跛梗。 笑死寻馏,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的核偿。 我是一名探鬼主播诚欠,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼漾岳!你這毒婦竟也來(lái)了轰绵?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤尼荆,失蹤者是張志新(化名)和其女友劉穎左腔,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體捅儒,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡液样,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年振亮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鞭莽。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡坊秸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出澎怒,到底是詐尸還是另有隱情褒搔,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布喷面,位于F島的核電站星瘾,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏惧辈。R本人自食惡果不足惜死相,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望咬像。 院中可真熱鬧,春花似錦生宛、人聲如沸县昂。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)倒彰。三九已至,卻和暖如春莱睁,著一層夾襖步出監(jiān)牢的瞬間待讳,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工仰剿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留创淡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓南吮,卻偏偏與公主長(zhǎng)得像琳彩,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子部凑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 排序(上):為什么插入排序比冒泡排序更受歡迎涂邀? 排序?qū)τ谌魏我粋€(gè)程序員來(lái)說(shuō)瘟仿,可能都不會(huì)陌生。你學(xué)的第一個(gè)算法比勉,可能...
    GhostintheCode閱讀 3,359評(píng)論 4 27
  • 知 識(shí) 點(diǎn) / 超 人 數(shù)據(jù)結(jié)構(gòu)算法排序是比較枯燥的知識(shí)劳较,學(xué)習(xí)一定要耐著性子看驹止,不然很容易理解錯(cuò)誤。本文比較適合自...
    樹(shù)下敲代碼的超人閱讀 5,243評(píng)論 9 58
  • 總結(jié)一下常見(jiàn)的排序算法兴想。 排序分內(nèi)排序和外排序幢哨。內(nèi)排序:指在排序期間數(shù)據(jù)對(duì)象全部存放在內(nèi)存的排序。外排序:指在排序...
    jiangliang閱讀 1,342評(píng)論 0 1
  • 搞懂基本排序算法 上篇文章寫(xiě)了關(guān)于 Java 內(nèi)部類的基本知識(shí)嫂便,感興趣的朋友可以去看一下:搞懂 JAVA 內(nèi)部類捞镰;...
    醒著的碼者閱讀 1,189評(píng)論 3 4
  • synchronized作為Java悲觀鎖的一個(gè)重要組成,面試的時(shí)候也經(jīng)常會(huì)被問(wèn)到毙替,但是synchronized的...
    Moine0828閱讀 329評(píng)論 0 0