【C語言】氣泡排序與快速排序

喵喵淼發表於2020-12-01

氣泡排序

基本思想

對有n個記錄的序列進行氣泡排序,首先將第一個數字與第二個數字進行比較,若為逆序,則將兩個數字的順序交換。然後比較第二個數字與第三個數字,若為逆序,則將兩個數字的順序交換…依此類推,經過第一輪排序後,最大的數字將“下沉”到最後,每趟的比較次數依次減少。經過n-1輪排序,將得到一個遞增的序列。

在這裡插入圖片描述

空間複雜度:O(1)

時間複雜度:O(n^2)

穩定性:穩定

程式碼實現

n個記錄總共要進行n-1趟排序,第i趟的比較次數為n-i次。可以使用雙層迴圈,外層迴圈控制第幾輪排序,內層控制每一輪比較的次數。

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
void Input(); //輸入陣列
void Output(); //輸出陣列
void BubbleSort(); //氣泡排序

int arr[MAXSIZE];
int count = 0;

//氣泡排序
void BubbleSort(){
    int i ,j ,temp;
    for ( i = 0; i < count; i++)
    {
        for ( j = 0; j < count-i; j++)
        {
            if (arr[j] > arr[j+1])
            {
               temp = arr[j];
               arr[j] = arr[j+1];
               arr[j+1] = temp;
            }
        }
    }
}
//輸入函式
void Input(){
    int x,i;
    char s;
    printf("please input less than 100 numbers, end with enter:\n");
    for (i = 0; s != '\n'; i++)
    {
        scanf("%d",&arr[i]);
        s = getchar();
        count++;
    }
}

//輸出函式
void Output(){
    printf("sorted numbers:\n");
    for (int i = 1; i <= count; i++){
        printf("%d\t",arr[i]);
    }
    printf("\n");
}

int main(){
    Input();
    BubbleSort();
    Output();
    system("pause");
    return 0;
}

執行結果:
在這裡插入圖片描述

快速排序

基本思想

快速排序是從氣泡排序改進而得的一種“交換”排序方法。採用的是一種分治的策略。

  1. 先從數列中取出一個數作為基準數(稱為樞軸)。

  2. 將比基準數大的數全放到它的右邊,小於或等於基準數的全放到它的左邊。

  3. 再對左右兩部分重複第(2)步,直到各區間只有一個數,達到整個序列有序。

在這裡插入圖片描述

空間複雜度:最好:O(n lb n),最壞:O(n)

時間複雜度:平均:O(n lb n),最壞:O(n^2)

穩定性:不穩定

程式碼實現

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
void Input(); //輸入陣列
void Output(); //輸出陣列
int Partition(int low ,int high);//一趟快速排序排
void QuikSort(int s, int e); //快速排序

int arr[MAXSIZE];
int count = 0;
//一趟快排
//定義一個high,low,key(記錄樞軸的值)
//最後將樞軸移到正確位置,返回樞軸的位置
int Partition(int low ,int high){
    arr[0] = arr[low]; //arr[0]記錄樞軸,待排序列從arr[1]開始
    while (low < high)
    {
       while(low < high&&arr[high] >= arr[0])
            --high;
        arr[low] = arr[high];
       while (low < high&&arr[low] <= arr[0])
            ++low;
        arr[high] = arr[low];
    }
    arr[low] = arr[0];
    return low;  //返回樞軸的位置
}
//快排(遞迴呼叫)
void QuikSort(int s,int e){
    if (s < e) //s與e是待排序區域的上下界
    {
        int keyPosition = Partition(s,e); //對待排序列進行一次劃分,並返回樞軸位置
        QuikSort(s,keyPosition-1);        //對左側子序列遞迴排序
        QuikSort(keyPosition+1,e);        //對右側子序列遞迴排序
    }
    
}
//輸入函式
void Input(){
    int x,i;
    char s;
    printf("please input less than 100 numbers, end with enter:\n");
    for (i = 1; s != '\n'; i++)
    {
        scanf("%d",&arr[i]);
        s = getchar();
        count++;
    }
}

//輸出函式
void Output(){
    printf("sorted numbers:\n");
    for (int i = 1; i <= count; i++){
        printf("%d\t",arr[i]);
    }
    printf("\n");
}

int main(){
    Input();
    QuikSort(1,count);
    Output();
    system("pause");
    return 0;
}

執行結果:

在這裡插入圖片描述

相關文章