1. 程式人生 > >C語言中三大經典的排序演算法

C語言中三大經典的排序演算法

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

氣泡排序:

思路:將相鄰的兩個數比較,將較小的數調到前頭;有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,則將從ik位置上的所有元素往後移動一位,然後將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 Wall sort_test.c o sort_test

執行:./sort_test

結果如下:

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

相關推薦

C語言三大經典排序演算法

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

C語言100個經典演算法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

(排序演算法)linux c語言實現二分插入排序演算法(簡化版本的插入排序演算法

 二分插入演算法是在已經排序好的序列裡插入一個元素,是穩定的演算法,關鍵詞是折中。 比如說我要在12345678910裡插入一個3,那麼我先看看中間的數比3大,還是比3小,要是比3大,我就去後一半,如果是比3小,我就去前一半,現在進入某個一半後,再做如此操作,最後將其他的元素依次往後挪

C語言實現六種排序演算法

C語言實現六種排序演算法 C語言實現六種排序演算法 氣泡排序 插入排序 歸併排序 快速排序 希爾排序

C語言簡單實現氣泡排序演算法

#include <stdio.h> #include <stdlib.h> int main() {     int i,j,t,a[10]={10,9,52,7,1,6,2

演算法 c語言 鏈式插入排序演算法

一.標頭檔案linklist.h定義 #ifndef __LINKLIST_H__ #define __LINKLIST_H__ #include<stdio.h> #include<stdlib.h> #include<stdbool.h&g

C語言:用快速排序演算法對一個數組進行排序

#include<stdio.h> #include<stdlib.h> #include<time.h> #define NUMBER 10 //NUMBER為陣

C語言實現九大排序演算法

- [C語言實現九大排序演算法](#c語言實現九大排序演算法) - [直接插入排序](#直接插入排序) - [折半插入排序](#折半插入排序) - [希爾排序](#希爾排序) - [氣泡排序](#氣泡排序) - [快速排序](#快速排序) - [直接選擇排序](

C語言常用排序演算法(氣泡排序、選擇排序、插入排序、希爾排序、快速排序、堆排序)實現比較

以下程式在win10 X64位作業系統,使用VS2017執行驗證可行 排序是非常重要且很常用的一種操作,有氣泡排序、選擇排序、插入排序、希爾排序、快速排序、堆排序等多種方法。 例項1 冒泡法排序 1.前言: 陣列中有N個整數,用冒泡法將它們從小到大(或從大到小)排序。冒泡法

常見演算法C語言排序演算法--氣泡排序,選擇排序,希爾排序

氣泡排序(Bubble Sort,臺灣譯為:泡沫排序或氣泡排序)是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小

C語言冒泡法、選擇法、插入法三種常見排序演算法分析

一、冒泡法(起泡法)  演算法要求:用起泡法對10個整數按升序排序。     演算法分析:如果有n個數,則要進行n-1趟比較。在第1趟比較中要進行n-1次相鄰元素的兩兩比較,在第j趟比較中要進行n-j次兩兩比較。比較的順序從前往後,經過一趟比較後,將最值沉底(換到最後一個元

五種C語言非數值計算的常用經典排序演算法

摘要:排序是計算機的一種操作方法,其目的是將一組“無序”的記錄序列調整為“有序”的記錄序列,主要分為內部排序和外部排序。 排序 排序是計算機的一種操作方法,其目的是將一組“無序”的記錄序列調整為“有序”的記錄序列,主要分為內部排序和外部排序。 (1)氣泡排序(起泡排序) 氣泡排序(Bubble Sort),其

排序演算法c語言描述---直接插入排序

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

排序演算法c語言描述---希爾排序

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

排序演算法c語言描述---雙向氣泡排序

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

python經典排序演算法----- 氣泡排序

lt = [1, 5, 7, 3, 2] # 氣泡排序:從小到大 # 第一輪:1 5 3 2 7 # 第二輪:1 3 2 5 7 n = len(lt) # 外層迴圈控制比較多少輪 for i in range(n-1): # 內層迴圈控制元素的比較 for

經典排序演算法---希爾排序C/C#)

        原理:每隔sp(整數)個數即取數並判斷大小,交換,先構造區域性有序序列,直到sp為1,構造完整的有序序列。         給出一組資料,如下: 0 1 2 3 4

Atitit order algo 排序演算法 演算法之道 目錄 1.1. 生活常用的排序是插入排序和選擇排序 2 2. 0.1 演算法分類 2 3. .2 演算法複雜度 3 4. 十大經典排序演算法(動圖

Atitit order algo 排序演算法 演算法之道   目錄 1.1. 生活中常用的排序是插入排序和選擇排序 2 2. 0.1 演算法分類 2 3. .2 演算法複雜度 3 4. 十大經典排序演算法(動圖演示) 2 4 4.1. 0、演算法概述 2 4

深度剖析八大經典排序演算法C++實現(通俗易懂版)

內容會持續更新,有錯誤的地方歡迎指正,謝謝! 引言 需握各種排序和常用的資料結構的核心思想,並知道是以什麼樣的方式解決了什麼樣的問題。 該部落格的示例程式碼均以遞增排序為目的~ 學習建議:切忌看示例程式碼去理解演算法,而是理解演算法原理寫出程式碼,否

c語言使用自帶的qsort(結構體排序

c中沒有自帶的sort函式emm 不過有自帶的qsort函式 (其實用法都差不多(只是我經常以為c中有sort 標頭檔案要用  1 #include <stdlib.h>  一定要重新把指標指向的值賦值給一個node型別,不然比較不了 1 struct node{ 2 int d,i