排序算法總結

借用一張圖,直觀對比各種排序算法的性能
這裏寫圖片描述

1.快速排序

要點:每次選擇一個**基準元素**pivot,將小於pivot的移到左邊,大於pivot的移到右邊。
這個動圖很贊 這裏寫鏈接內容

int mypartition(int* array, int left, int right) {
    int pivot = array[left];
    int low = left, high = right;
    while (low < high) {
        while (low<high&&array[high]>=pivot)//注意等於號
            --high;
        array[low] = array[high];
        while (low < high&&array[low] <= pivot)//注意等於號
            ++low;
        array[high] = array[low];
    }
    array[low] = pivot;
    return low;
}
void myQuickSort(int* array, int left, int right) {
    if (left < right) {
        int pivot = mypartition(array, left, right);
        myQuickSort(array, left, pivot - 1);
        myQuickSort(array, pivot + 1, right);
    }
}

2、冒泡排序

兩兩比較,把較大的往右移。一共需要n-1。
冒泡是穩定的,兩兩比較,而且只存在一個方向上的移動。

//升序
void bubbleSort(int* A, int n) {
    for (int i = 1; i < n; i++) {
        for (int j = 0; j < n - i; j++) {
            if (A[j] > A[j + 1])//大的往右移
                swap(A[j], A[j + 1]);
        }
    }
}

3、選擇排序

每趟選出待排序元素中最小的一個,與前面的交換。
不穩定:因爲位於前面的元素可能會被換到最後面。

//升序
void selectSort(int* A, int n) {
    for (int i = 0; i < n - 1; i++) {
        int k = i;
        for (int j = i + 1; j < n; j++) {
            if (A[j] < A[k])//記錄最小的元素下標
                k = j;
        }
        swap(A[i], A[k]);
    }
}

4、插入排序

假設左邊是有序的,右邊是無序的。把右邊的元素依次插入左邊。
插入的規則:往左比較,如果小於左邊,則把左邊的元素右移騰出位置。
穩定

void insertSort(int* A, int n) {
    int j;
    for (int i = 1; i < n; i++) {
        int v = A[i];
        int j = i - 1;
        for (; j >= 0 && v < A[j]; j--)//如果小於,其他元素右移騰出一個位置
            A[j + 1] = A[j];
        A[j+1] = v;
    }
}

5、歸併排序

分治法,把數據分成很多小份讓它們有序,然後再合併
是穩定的。

void merge(int*A, int left,int mid, int right, int* temp) {
    int i = left, j = mid + 1;
    int m = mid, n = right;
    int k = 0;
    while (i <= m&&j <= n) {
        if (A[i] <= A[j])//小的先放左邊
            temp[k++] = A[i++];
        else
            temp[k++] = A[j++];
    }
    while (i <= m)
        temp[k++] = A[i++];
    while (j <= n)
        temp[k++] = A[j++];
    for (i = 0; i < k; i++)
        A[left + i] = temp[i];
}
void mergeSort2(int* A, int left, int right,int* temp) {
    if (left < right) {
        int mid = left + (right - left) / 2;
        mergeSort2(A, left, mid, temp);
        mergeSort2(A, mid + 1, right, temp);
        merge(A, left, mid, right, temp);
    }
}

參考博文:
視覺直觀感受7種常用排序算法
八大排序算法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章