介绍数据结构中主要排序算法的流程与具体实现。包括以下八个排序算法:插入排序、希尔排序、冒泡排序、快速排序、选择排序、堆排序、归并排序、基数排序。

一、排序算法一览

排序方法时间复杂度空间复杂度稳定性所属类别
插入排序O(n²)O(1)插入法
选择排序O(n²)O(1)×(√)选择法
冒泡排序O(n²)O(1)交换法
希尔排序O(n¹˙³)O(1)×插入法
快速排序O(nlogn)O(logn)×交换法
堆排序O(nlogn)O(1)×选择法
归并排序O(nlogn)O(n)-
基数排序O(d*n)O(n)-

二、具体算法实现

(一)插入排序

/**
 * 插入排序
 * @param list 待排序的数组
 * @param size 待排序的数组大小
 */
void insertionSort(int* list, int size){
    for (int i = 1; i < size; ++i) {
        //"无序区首位元素"小于"有序区尾部元素"时,将当前元素插入有序区 (无序区"首位元素"为i对应的当前元素, 有序区尾部元素为i-1对应的上一元素)
        if (list[i] < list[i-1]){
            int temp = list[i];
            int j;
            //将有序区中所有大于当前元素的值整体向后移动一步
            for (j = i-1; temp < list[j] && j >= 0; --j) {
                list[j+1] = list[j];
            }
            //将当前元素放入正确的位置
            list[j+1] = temp;
        }
    }
}

(二)选择排序

/**
 * 选择排序
 * @param list 待排序的数组
 * @param size 待排序的数组大小
 */
void selectionSort(int* list, int size){
    for (int i = 0; i < size; ++i) {
        int minIndex;
        //遍历无序区
        //找到无序区最小的元素, 并保存其下标
        for (int j = i; j < size; ++j) {
            if (list[j] < list[minIndex]){
                minIndex = j;
            }
        }
        //将"无序区最小元素"与"无序区首位元素"互换("无序区首位元素"为i对应的当前元素)
        //此时新的"无序区的首位元素"进入有序区尾部
        if (i != minIndex){
            int temp = list[i];
            list[i] = list[minIndex];
            list[minIndex] = temp;
        }
    }
}

(三)冒泡排序

/**
 * 冒泡排序
 * @param list 待排序的数组
 * @param size 待排序的数组大小
 */
void bubbleSort(int* list, int size){
    for (int i = 0; i < size; ++i) {
        for (int j = i; j < size; ++j) {
            if (list[j] > list[j+1]){
                int temp = list[j];
                list[j] = list[j+1];
                list[j+1] = temp;
            }
        }
    }
}

(四)希尔排序

(五)快速排序

(六)堆排序

(七)归并排序

(八)基数排序

参考文档

  1. 《数据结构及应用算法教程 严蔚敏 陈文博 著》
  2. 《软件设计师教程 胡圣明 褚华 著》