c語言中冒泡排序、插入排序、選擇排序演算法比較

來源:互聯網
上載者:User

掌握好常用的排序演算法,在實際的項目開發中可以節省很多的時間。每一種排序演算法在執行的效率上是存在差別的,這些微小的時間差,也許在平常的聯絡當中感覺不到,但是涉及到資料量比較大或者是在資源比較緊張的系統中就顯得尤其的重要,比如嵌入式系統。下面簡要介紹三種常用的排序演算法以及他們的執行效率的比較。

       冒泡排序:

       思路:將相鄰的兩個數比較,將較小的數調到前頭;有n個數就要進行n-1趟比較,第一次比較中要進行n-1次兩兩比較,在第j趟比較中,要進行n-j次兩兩比較。

    void BublleSort (int arr [], int count)        {            int i, j, temp;            for(j=0; j<count-1; j ) /* 冒泡法要排序n-1次*/                for(i=0; i<count-j-1; i++ )/* 值比較大的元素沉下去後,只把剩下的元素中的最大值再沉下去就可以啦 */                {                    if(arr[i]>arr[i 1])/* 把值比較大的元素沉到底 */                    {                        temp=arr[i 1];                        arr[i 1]=arr[i];                        arr[i]=temp;                    }                }        }

插入排序:

       思路:在得到要排序的數組以後,講數組分為兩個部分,數組的第一個元素為一個部分,剩下的元素為一部分,然後從數組的第二個元素開始,和該元素以前的所有元素比較,如果之前的元素沒有比該元素大的,那麼該元素的位置不變,如果有元素的值比該元素大,那麼記錄相愛他所在的位置;例如I,該元素的位置為k,則將從i到k位置上的所有元素往後移動一位,然後將k位置上的值移動到i位置上。這樣就找到了K所在的位置。每一個元素都這樣進行,最終就會得到排好順序的數組。

       實現代碼:

    void InsertSort ( int arr[],int count)        {                int i,j,temp;            for(i=1; i<count; i++ )//數組分兩個部分,從第二個數組元素開始            {                temp = arr[i];//操作當前元素,先儲存在其它變數中                for(j=i-1; j>-1&&arr[j]>temp;j--)//從當前元素的上一個元素開始尋找合適的位置,一直尋找到首元素                {                    arr[i] = arr[j];                    arr[j] = temp;                }        }    }

   選擇排序:

       思路:

       首先以一個元素為基準,從一個方向開始掃描,比如從左至右掃描,以A[0]為基準,接下來從A[0]….A[9]中找出最小的元素,將其與A[0]交換。然後將其基準位置右移一位,重複上面的動作,比如,以A[1]為基準,找出A[1]~A[9]中最小的,將其與A[1]交換。一直進行到將基準位置移到數組最後一個元素時排序結束。

       實現代碼:

    void SelectSort(int arr[], int count)        {            int i,j,min,temp;            for(i=0; i<count; i++ )                {                min = arr[i];//以此元素為基準                for(j=i 1; j<count; j )//從j往前的資料都是排好的,所以從j開始往下找剩下的元素中最小的                {                    if(min>arr[j])//把剩下元素中最小的那個放到arr[j]中                    {                        temp = arr[j];                        arr[j] = min;                        min = temp;                    }                }            }        }

效率比較:

       為了能夠更加明顯的查看其效果,將每個排序演算法執行10000次。下面是測試程式主函數:

    #include <stdio.h>    #include<stdlib.h>    #include <sys/time.h>    #include <unistd.h>    #define MAX 6    int array[MAX];    int count = MAX;    /********建立數組,並輸入元素************/    void BuildArray()    {        int a,i=0;        printf("請輸入數組元素: ");        for(; i<count; i )        {            scanf("%d", &a);            array[i] = a;        }        printf("\n");    }    /**********遍曆輸出數組元素*************/    void Traverse(int arr[], int count)    {        int i;        printf("數組輸出: ");        for(i=0; i<count; i++ )            printf("%d\t", arr[i]);        printf("\n");    }    void BublleSort(int arr[], int count)    {        int i,j,temp;        for(j=0; j<count-1; j++ ) /* 氣泡法要排序n-1次*/            for(i=0; i<count-j-1; i++ )/* 值比較大的元素沉下去後,只把剩下的元素中的最大值再沉下去就可以啦 */            {                if(arr[i]>arr[i+1])/* 把值比較大的元素沉到底 */                {                    temp=arr[i+1];                    arr[i+1]=arr[i];                    arr[i]=temp;                }            }    }    void InsertSort(int arr[],int count)    {        int i,j,temp;        for(i=1; i<count; i++ )//數組分兩個部分,從第二個數組元素開始        {            temp = arr[i];//操作當前元素,先儲存在其它變數中            for(j=i-1; j>-1&&arr[j]>temp;j--)//從當前元素的上一個元素開始尋找合適的位置,一直尋找到首元素            {                arr[i] = arr[j];                arr[j] = temp;            }        }    }    void SelectSort(int arr[], int count)    {        int i,j,min,temp;        for(i=0; i<count; i++ )        {            min = arr[i];//以此元素為基準            for(j=i 1; j<count; j++ )//從j往前的資料都是排好的,所以從j開始往下找剩下的元素中最小的            {                if(min>arr[j])//把剩下元素中最小的那個放到arr[j]中                {                    temp = arr[j];                    arr[j] = min;                    min = temp;                }            }        }    }    int main()    {        int i;        struct timeval tv1,tv2;        struct timezone tz;        BuildArray();//建立數組        Traverse(array, count);//輸出最初數組        gettimeofday(&tv1,&tz);        for(i=0;i<10000;i++)            BublleSort(array, count);//冒泡排序        gettimeofday(&tv2,&tz);        printf("%d:%d/n",tv2.tv_sec-tv1.tv_sec,tv2.tv_usec-tv1.tv_usec);        Traverse(array, count);//輸出排序後的數組                gettimeofday(&tv1,&tz);        for(i=0;i<10000;i++)            InsertSort(array, count);//插入排序        gettimeofday(&tv2,&tz);        printf("%d:%d/n",tv2.tv_sec-tv1.tv_sec,tv2.tv_usec-tv1.tv_usec);        Traverse(array, count);//輸出排序後的數組                 gettimeofday(&tv1,&tz);        for(i=0;i<10000;i++)            SelectSort(array, count);//插入排序        gettimeofday (&tv2,&tz);        printf("%d:%d/n",tv2.tv_sec-tv1.tv_sec,tv2.tv_usec-tv1.tv_usec);        Traverse(array, count);//輸出排序後的數組        return 0;    }

編譯:gcc –g –Wall sort_test.c –o sort_test

運行:./sort_test

結果如下:

通過多次測試,插入排序的速度最快。

文章轉自:http://blog.chinaunix.net/uid-26758209-id-3139356.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.