亚洲中文日韩国产一区|亚洲国产精品原创巨作AV无遮挡|色依依国内精品中文字幕|日韩精品免费在线视频

<button id="lyzxa"><option id="lyzxa"><em id="lyzxa"></em></option></button>
    C語(yǔ)言

    C語(yǔ)言中三種常見排序算法分析

    時(shí)間:2024-07-27 11:42:45 C語(yǔ)言 我要投稿
    • 相關(guān)推薦

    C語(yǔ)言中三種常見排序算法分析

      C語(yǔ)言的設(shè)計(jì)目標(biāo)是提供一種能以簡(jiǎn)易的方式編譯、處理低級(jí)存儲(chǔ)器、產(chǎn)生少量的機(jī)器碼以及不需要任何運(yùn)行環(huán)境支持便能運(yùn)行的編程語(yǔ)言。那么C語(yǔ)言中三種常見排序算法的分析情況是怎樣的呢。以下僅供參考!

      一、冒泡法(起泡法)

      算法要求:用起泡法對(duì)10個(gè)整數(shù)按升序排序。

      算法分析:如果有n個(gè)數(shù),則要進(jìn)行n-1趟比較。在第1趟比較中要進(jìn)行n-1次相鄰元素的兩兩比較,在第j趟比較中要進(jìn)行n-j次兩兩比較。比較的順序從前往后,經(jīng)過(guò)一趟比較后,將最值沉底(換到最后一個(gè)元素位置),最大值沉底為升序,最小值沉底為降序。

      算法源代碼:

      # include

      main()

      {

      int a[10],i,j,t;

      printf("Please input 10 numbers: ");

      /*輸入源數(shù)據(jù)*/

      for(i=0;i<10;i++)

      scanf("%d",&a[i]);

      /*排序*/

      for(j=0;j<9;j++) /*外循環(huán)控制排序趟數(shù),n個(gè)數(shù)排n-1趟*/

      for(i=0;i<9-j;i++) /*內(nèi)循環(huán)每趟比較的次數(shù),第j趟比較n-j次*/

      if(a[i]>a[i+1]) /*相鄰元素比較,逆序則交換*/

      { t=a[i];

      a[i]=a[i+1];

      a[i+1]=t;

      }

      /*輸出排序結(jié)果*/

      printf("The sorted numbers: ");

      for(i=0;i<10;i++)

      printf("%d ",a[i]);

      printf(" ");

      }

      算法特點(diǎn):相鄰元素兩兩比較,每趟將最值沉底即可確定一個(gè)數(shù)在結(jié)果的位置,確定元素位置的順序是從后往前,其余元素可能作相對(duì)位置的調(diào)整?梢赃M(jìn)行升序或降序排序。

      算法分析:定義n-1次循環(huán),每個(gè)數(shù)字比較n-j次,比較前一個(gè)數(shù)和后一個(gè)數(shù)的大小。然后交換順序。

      二、選擇法

      算法要求:用選擇法對(duì)10個(gè)整數(shù)按降序排序。

      算法分析:每趟選出一個(gè)最值和無(wú)序序列的第一個(gè)數(shù)交換,n個(gè)數(shù)共選n-1趟。第i趟假設(shè)i為最值下標(biāo),然后將最值和i+1至最后一個(gè)數(shù)比較,找出最值的下標(biāo),若最值下標(biāo)不為初設(shè)值,則將最值元素和下標(biāo)為i的元素交換。

      算法源代碼:

      # include

      main()

      {

      int a[10],i,j,k,t,n=10;

      printf("Please input 10 numbers:");

      for(i=0;i<10;i++)

      scanf("%d",&a[i]);

      for(i=0;i<n-1;i++) /*外循環(huán)控制趟數(shù),n個(gè)數(shù)選n-1趟*/

      {

      k=i; /*假設(shè)當(dāng)前趟的第一個(gè)數(shù)為最值,記在k中 */

      for(j=i+1;j<n;j++) /*從下一個(gè)數(shù)到最后一個(gè)數(shù)之間找最值*/

      if(a[k]<a[j]) /*若其后有比最值更大的*/

      k=j; /*則將其下標(biāo)記在k中*/

      if(k!=i) /*若k不為最初的i值,說(shuō)明在其后找到比其更大的數(shù)*/

      { t=a[k]; a[k]=a[i]; a[i]=t; }/*則交換最值和當(dāng)前序列的第一個(gè)數(shù)*/

      }

      printf("The sorted numbers: ");

      for(i=0;i<10;i++)

      printf("%d ",a[i]);

      printf(" ");

      }

      算法特點(diǎn):每趟是選出一個(gè)最值確定其在結(jié)果序列中的位置,確定元素的位置是從前往后,而每趟最多進(jìn)行一次交換,其余元素的相對(duì)位置不變?蛇M(jìn)行降序排序或升序排序。

      算法分析:定義外部n-1次循環(huán),假設(shè)第一個(gè)為最值,放在參數(shù)中,在從下一個(gè)數(shù)以后找最值若后面有比前面假設(shè)的最值更大的就放在k中,然后在對(duì)k進(jìn)行分析。若k部位最初的i值。也就是假設(shè)的i不是最值,那么就交換最值和當(dāng)前序列的第一個(gè)數(shù)

      三、插入法

      算法要求:用插入排序法對(duì)10個(gè)整數(shù)進(jìn)行降序排序。

      算法分析:將序列分為有序序列和無(wú)序列,依次從無(wú)序序列中取出元素值插入到有序序列的合適位置。初始是有序序列中只有第一個(gè)數(shù),其余n-1個(gè)數(shù)組成無(wú)序序列,則n個(gè)數(shù)需進(jìn)n-1次插入。尋找在有序序列中插入位置可以從有序序列的最后一個(gè)數(shù)往前找,在未找到插入點(diǎn)之前可以同時(shí)向后移動(dòng)元素,為插入元素準(zhǔn)備空間。

      算法源代碼:

      # include

      main()

      {

      int a[10],i,j,t;

      printf("Please input 10 numbers: ");

      for(i=0;i<10;i++)

      scanf("%d",&a[i]);

      for(i=1;i<10;i++)/*外循環(huán)控制趟數(shù),n個(gè)數(shù)從第2個(gè)數(shù)開始到最后共進(jìn)行n-1次插入*/

      {

      t=a[i]; /*將待插入數(shù)暫存于變量t中*/

      for( j=i-1 ; j>=0 && t>a[j] ; j-- ) /*在有序序列(下標(biāo)0 ~ i-1)中尋找插入位置*/

      a[j+1]=a[j]; /*若未找到插入位置,則當(dāng)前元素后移一個(gè)位置*/

      a[j+1]=t; /*找到插入位置,完成插入*/

      }

      printf("The sorted numbers: ");

      for(i=0;i<10;i++)

      printf("%d ",a[i]);

      printf(" ");

      }

      算法特點(diǎn):每趟從無(wú)序序列中取出第一個(gè)數(shù)插入到有序序列的合適位置,元素的最終位置在最后一趟插入后才能確定位置。也可是先用循環(huán)查找插入位置(可從前往后或從后往前),再將插入位置之后的元素(有序列中)逐個(gè)后移一個(gè)位置,最后完成插入。該算法的特點(diǎn)是在尋找插入位置的同時(shí)完成元素的移動(dòng)。因?yàn)樵氐囊苿?dòng)必須從后往前,則可將兩個(gè)操作結(jié)合在一起完成,提高算法效率。仍可進(jìn)行升序或降序排序。

      幾種排序的概念

      1、冒泡排序

      算法思想簡(jiǎn)單描述:

      在要排序的一組數(shù)中,對(duì)當(dāng)前還未排好序的范圍內(nèi)的全部數(shù),自上而下對(duì)相鄰的兩個(gè)數(shù)依次進(jìn)行比較和調(diào)整,讓較大的數(shù)往下沉,較小的往上冒。即:每當(dāng)兩相鄰的數(shù)比較后發(fā)現(xiàn)它們的排序與排序要求相反時(shí),就將它們互換。

      下面是一種改進(jìn)的冒泡算法,它記錄了每一遍掃描后最后下沉數(shù)的位置k,這樣可以減少外層循環(huán)掃描的次數(shù)。

      冒泡排序是穩(wěn)定的。算法時(shí)間復(fù)雜度O(n2)–[n的平方]

      2、選擇排序

      算法思想簡(jiǎn)單描述:

      在要排序的一組數(shù)中,選出最小的一個(gè)數(shù)與第一個(gè)位置的數(shù)交換;然后在剩下的數(shù)當(dāng)中再找最小的與第二個(gè)位置的數(shù)交換,如此循環(huán)到倒數(shù)第二個(gè)數(shù)和最后一個(gè)數(shù)比較為止。

      選擇排序是不穩(wěn)定的。算法復(fù)雜度O(n2)–[n的平方]

      3、直接插入排序

      算法思想簡(jiǎn)單描述:

      在要排序的一組數(shù)中,假設(shè)前面(n-1) [n>=2] 個(gè)數(shù)已經(jīng)是排好順序的,現(xiàn)在要把第n個(gè)數(shù)插到前面的有序數(shù)中,使得這n個(gè)數(shù)也是排好順序的。如此反復(fù)循環(huán),直到全部排好順序。

      直接插入排序是穩(wěn)定的。算法時(shí)間復(fù)雜度O(n2)–[n的平方]

    【C語(yǔ)言中三種常見排序算法分析】相關(guān)文章:

    C語(yǔ)言冒泡排序算法實(shí)例06-15

    C語(yǔ)言選擇排序算法及實(shí)例代碼07-25

    C語(yǔ)言插入排序算法及實(shí)例代碼07-02

    C語(yǔ)言中使用快速排序算法對(duì)元素排序的實(shí)例06-20

    C語(yǔ)言實(shí)現(xiàn)歸并排序算法實(shí)例09-18

    java常見的排序算法的代碼09-20

    桶排序算法的理解及C語(yǔ)言版代碼示例07-11

    java堆排序的算法思想的分析09-14

    C語(yǔ)言經(jīng)典冒泡排序法09-24

    經(jīng)典c語(yǔ)言冒泡排序法08-08