1. 程式人生 > >氣泡排序、快速排序--C語言

氣泡排序、快速排序--C語言

  排序演算法分為內部排序和外部排序,內部排序又分為交換排序、選擇排序、插入排序。今天寫一下交換排序的演算法。
  交換排序的思想是比較兩個物件的關鍵字,如果這兩個物件的關鍵字發生逆序,則交換這兩個物件的位置。交換排序分為氣泡排序和快速排序。
  對於氣泡排序:如果待排序的元素有n個,則要進行n-1輪比較,第i輪的比較次數為n-i-1次。對於氣泡排序演算法的改進則是增加一個bool型別的變數,用於記錄第i輪是否發生過元素交換,如果沒有發生過元素交換,則排序演算法結束,元素已經有序,否則要進行下一輪。

氣泡排序程式碼如下:

//氣泡排序
void bubbleSort(int *
arr,int len) { int i = 0; int j = 0; int temp = 0;//中間變數,用於進行兩個數的交換 bool sig = false;//標誌位,如果經過某一輪比較,沒有數字進行交換,說明當前陣列已經是有序的,不用再進行剩餘的比較 for(i = 0;i < len;i++) { sig = false; for(j = 0;j < len - i - 1;j++) { if(arr[j + 1] < arr[j]) {
temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; sig = true; } } if(!sig) { break; } } }

  對於快速排序(從大到小排序),其基本原理是:隨機選取一個元素作為樞紐元素,將所有大於樞紐元素的元素放到樞紐元素的右邊,將所有小於或等於該樞紐元素的元素放到該樞紐元素的左邊;此時,樞紐元素的最終位置已經確定,而陣列被分為兩部分,其中一部分元素均比樞紐元素的值大,另一部分的元素均不大於樞紐元素,對被分為兩部分的元素重複上述過程,直到所有元素都在最終位置上。
  程式碼的設計是首先選取第一個元素作為樞紐元素(其中0下標位置用於存放樞紐元素),之後分別將被分為兩部分的元素的第一個元素作為樞紐元素重複上述過程。

快速排序演算法程式碼如下:

//快速排序,a[0]用於存放樞紐元素
void QuikSort(int *arr,int m,int n)
{
    if(m >= n)
    {
        return;
    }
    int low = m;
    int high = n;
    arr[0] = arr[low];
    while(low < high)
    {
        while(arr[high] > arr[0] && high > low)
        {
            high --;
        }
        arr[low] = arr[high];
        while(arr[low] <= arr[0] && low < high)
        {
            low++;
        }
        arr[high] = arr[low];
    }
    arr[low] = arr[0];//樞紐元素的最終位置
    QuikSort(arr,m,low - 1);
    QuikSort(arr,low + 1,n);
}

  今天寫完快速排序的演算法後,突然有了點自信。之前不敢投簡歷一直覺得自己沒有準備好,排序演算法還沒有看,查詢相關的知識點還沒有複習,圖的內容也忘的差不多了。。。好多理由,同時也是好多借口。總覺得知識沒有在自己腦子裡,其實只是自己不願意認真思考的一個藉口。今天自己沒有看書,沒有找ppt,憑藉著自己之前的記憶與理解寫出了快速排序的演算法,雖然程式碼寫的不是特別好,但是至少證明快速排序演算法的理論和氣泡排序的理論自己還是知道,它們已經深深印在自己腦子裡,只是自己沒有去查詢它們而已。不要覺得自己學過的東西必須經過再次看書複習才能知道,其實只要自己稍微思考一下,喚起自己的記憶,很多東西自己是沒有忘記的!
  沒有準備好只是自己給自己的懶惰和害怕找的藉口而已。多動腦,多思考,多動手,堅信自己是最棒的!要不然自己的一生都要為這個“沒有準備好”的藉口買單了。實踐出真知,行動才有可能,在那裡空想沒有一點幫助,反而會增加自己的焦慮感!
今天有點囉嗦了,只是自己感慨頗多~~~最後把所有的程式碼一併附上吧~

#include <stdio.h>

//氣泡排序
void bubbleSort(int *arr,int len)
{
    int i = 0;
    int j = 0;
    int temp = 0;//中間變數,用於進行兩個數的交換
    bool sig = false;//標誌位,如果經過某一輪比較,沒有數字進行交換,說明當前陣列已經是有序的,不用再進行剩餘的比較
    for(i = 0;i < len;i++)
    {
        sig = false;
        for(j = 0;j < len - i - 1;j++)
        {
            if(arr[j + 1] < arr[j])
            {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
                sig = true;
            }
        }
        if(!sig)
        {
            break;
        }
    }
}

//快速排序,a[0]用於存放樞紐元素
void QuikSort(int *arr,int m,int n)
{
    if(m >= n)
    {
        return;
    }
    int low = m;
    int high = n;
    arr[0] = arr[low];
    while(low < high)
    {
        while(arr[high] > arr[0] && high > low)
        {
            high --;
        }
        arr[low] = arr[high];
        while(arr[low] <= arr[0] && low < high)
        {
            low++;
        }
        arr[high] = arr[low];
    }
    arr[low] = arr[0];//樞紐元素的最終位置
    QuikSort(arr,m,low - 1);
    QuikSort(arr,low + 1,n);
}

int main()
{
    int i = 0;
    int arr[5] = {6,3,8,5,2};
    printf("Before bubble sort arr:");
    for(i = 0;i < 5;i++)
    {
        printf("%d ",arr[i]);
    }
    printf("\n");
    bubbleSort(arr,5);
    printf("After bubble sort arr:");
    for(i = 0;i < 5;i++)
    {
        printf("%d ",arr[i]);
    }
    printf("\n");
    int arr2[9] = {0,20,31,15,8,38,4,52,44};
    printf("Before quick sort arr2:");
    for(i = 1;i < 9;i ++)
    {
        printf("%d ",arr2[i]);
    }
    printf("\n");
    QuikSort(arr2,1,8);
    printf("After quick sort arr2:");
    for(i = 1;i < 9;i ++)
    {
        printf("%d ",arr2[i]);
    }
    printf("\n");
    return 0;
}