溫習排序算法(基於C指針)

之前學過的數據結構課,貌似已經忘得一乾二淨了,偶然又翻起,書中最後一章詳細介紹了7種排序算法,如今對其中4種作個總結。(爲啥只總結4種,固然是由於偷懶,只想總結簡單又經常使用的!)算法

 先貼一張排序分類圖:數據結構

 

1.冒泡法:

主要思想:每次比較相鄰的兩個數,較小的數向上冒,較大的數向下沉。

  演示效果:spa

      

  C代碼:(指針p指向待排序列的首地址,length是待排序列的總長度,下同)3d

swap(int *p1, int *p2)
{
    int tmp;
    tmp = *p1;
    *p1 = *p2;
    *p2 = tmp;
}

Msort(int *p, int length)
{
    BOOLEAN flag = TRUE;
    for (int i = 0; i < length && flag; i++){
        flag = FALSE;
        for (int j = length - 1; j > i; j--)
            if (*(p + j) < *(p + j - 1))
            {
                swap(p + j, p + j - 1);
                flag = TRUE;
            }
    }
}

 

2.簡單選擇法:

  主要思想:每輪循環找到一個最小數的標號,循環結束後進行一次交換。

   演示效果:指針

      

  C代碼:code

swap(int *p1, int *p2)
{
    int tmp;
    tmp = *p1;
    *p1 = *p2;
    *p2 = tmp;
}
Xsort(
int *p, int length) { for (int i = 0; i < length - 1; i++){ int min = i; for (int j = i + 1; j < length; j++){ if (*(p + j) < *(p + min)) min = j; } if (min != i) swap(p + i, p + min); } }

 

3.直接插入法:

   主要思想:每輪循環都是實現將一個新來的數插入到原有的一個有序子序列中。

   演示效果:blog

  

   C代碼:排序

swap(int *p1, int *p2)
{
    int tmp;
    tmp = *p1;
    *p1 = *p2;
    *p2 = tmp;
}

Csort(int *p, int length)
{
    for (int i = 1; i < length; i++){
        if (*(p + i) < *(p + i - 1)){
            int tmp = *(p + i);
            int j;
            for (j = i - 1; j >= 0 && *(p + j) > tmp; j--)
                *(p + j + 1) = *(p + j);
            *(p + j + 1) = tmp;
        }
    }
}

 

4.快速排序法:

    冒泡排序的升級版,同屬於交換排序。遞歸

   主要思想:經過遞歸,不斷地二分序列,使相對較大的數位於一邊,相對較小的數位於另外一邊。

   演示效果:it

      

  C代碼:

swap(int *p1, int *p2)
{
    int tmp;
    tmp = *p1;
    *p1 = *p2;
    *p2 = tmp;
}

int partition(int *p, int startIdx, int endIdx)
{
    int pivotkey;
    pivotkey = *(p + startIdx);
    while (startIdx < endIdx)
    {
        while (startIdx < endIdx && *(p + endIdx) >= pivotkey)
            endIdx--;
        swap(p + startIdx, p + endIdx);

        while (startIdx < endIdx && *(p + startIdx) <= pivotkey)
            startIdx++;
        swap(p + startIdx, p + endIdx);
    }
    return startIdx;
}

Ksort(int *p, int startIdx,int endIdx)
{
    int pivot;
    if (startIdx < endIdx)
    {
        pivot = partition(p,startIdx,endIdx);
        Ksort(p, startIdx, pivot - 1);
        Ksort(p, pivot + 1, endIdx);
    }
}

 

5.舉例: 

//2018-8-20 
//by-lengwawa

#include<stdio.h>
#include<Windows.h>   //程序中的BOOLEAN在該頭文件中定義

main() { int n, i; int *p; p = NULL; printf("請輸入須要排序的個數:"); scanf_s("%d", &n); p = (int *)malloc(n*sizeof(int)); printf("\n請輸入%d個待排序的數:", n); for (int k = 0; k < n; k++) scanf_s("%d", p + k); printf("\n你要使用哪一種排序法(1——冒泡 2——選擇 3——插入 4——快排):"); scanf_s("%d", &i); printf("\n"); if (i == 1) { printf("使用冒泡排序法的結果是:"); Msort(p, n); for (int j = 0; j < n; j++) printf("%d ", *(p + j)); printf("\n\n\n"); } else if (i == 2) { printf("使用選擇排序法的結果是:"); Xsort(p, n); for (int j = 0; j < n; j++) printf("%d ", *(p + j)); printf("\n\n\n"); } else if (i == 3) { printf("使用插入排序法的結果是:"); Csort(p, n); for (int j = 0; j < n; j++) printf("%d ", *(p + j)); printf("\n\n\n"); } else { printf("使用快速排序法的結果是:"); Ksort(p, 0, n - 1);//這裏是標號,因此是n-1 for (int j = 0; j < n; j++) printf("%d ", *(p + j)); printf("\n\n\n"); } }

 

6.輸出:

 

 7.把另外3個的gif演示放一下吧,有興趣的看看

   選擇法升級版——堆排序

  

   插入法升級版——希爾排序

  

   歸併排序:

  

相關文章
相關標籤/搜索