侧边栏壁纸
博主头像
BvBeJ的小站 博主等级

行动起来,活在当下

  • 累计撰写 23 篇文章
  • 累计创建 1 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

七种经典排序算法

BvBeJ
2025-03-30 / 0 评论 / 0 点赞 / 4 阅读 / 0 字

以下是对七种经典排序算法的详细整理,包含步骤说明、C语言代码示例及具体演算过程:


一、直接插入排序(Straight Insertion Sort)

步骤

  1. 将第一个元素视为已排序序列
  2. 取未排序部分的第一个元素,在已排序序列中从后向前扫描
  3. 找到合适位置插入,确保插入后序列仍有序
  4. 重复步骤2-3直到所有元素插入完成

C代码示例

void InsertSort(int arr[], int n) {
    for (int i = 1; i < n; i++) {
        int key = arr[i];
        int j = i - 1;
        while (j >= 0 && arr[j] > key) {
            arr[j+1] = arr[j];
            j--;
        }
        arr[j+1] = key;
    }
}

演算示例​(数组:[5, 2, 4, 6, 1]):
第1轮:[2, 5, 4, 6, 1]
第2轮:[2, 4, 5, 6, 1]
第3轮:[2, 4, 5, 6, 1]
第4轮:[1, 2, 4, 5, 6]


二、希尔排序(Shell Sort)

步骤

  1. 选择增量序列(如gap = n/2, gap /= 2
  2. 对每个增量分组进行插入排序
  3. 缩小增量重复直到增量为1

C代码示例

void ShellSort(int arr[], int n) {
    for (int gap = n/2; gap > 0; gap /= 2) {
        for (int i = gap; i < n; i++) {
            int temp = arr[i];
            int j;
            for (j = i; j >= gap && arr[j-gap] > temp; j -= gap)
                arr[j] = arr[j-gap];
            arr[j] = temp;
        }
    }
}

演算示例​(数组:[9, 8, 3, 7, 5, 1],增量序列2,1):
gap=2时分组排序:[3, 8, 5, 7, 9, 1] → gap=1时最终排序:[1, 3, 5, 7, 8, 9]


三、冒泡排序(Bubble Sort)

步骤

  1. 比较相邻元素,若顺序错误则交换
  2. 每轮将最大元素"冒泡"到末尾
  3. 重复n-1轮(可优化提前终止)

C代码示例

void BubbleSort(int arr[], int n) {
    for (int i = 0; i < n-1; i++) {
        int swapped = 0;
        for (int j = 0; j < n-i-1; j++) {
            if (arr[j] > arr[j+1]) {
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
                swapped = 1;
            }
        }
        if (!swapped) break;
    }
}

演算示例​(数组:[5, 1, 4, 2, 8]):
第1轮:[1, 4, 2, 5, 8]
第2轮:[1, 2, 4, 5, 8](提前终止)


四、快速排序(Quick Sort)

步骤

  1. 选取基准元素(如最后一个元素)
  2. 分区操作:将小于基准的放左侧,大于的放右侧
  3. 递归排序左右子数组

C代码示例

void QuickSort(int arr[], int low, int high) {
    if (low < high) {
        int pivot = arr[high];
        int i = low - 1;
        for (int j = low; j <= high-1; j++) {
            if (arr[j] < pivot) {
                i++;
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
        int temp = arr[i+1];
        arr[i+1] = arr[high];
        arr[high] = temp;
        QuickSort(arr, low, i);
        QuickSort(arr, i+2, high);
    }
}

演算示例​(数组:[10, 7, 8, 9, 1, 5]):
基准选5 → 分区后:[1, 5, 8, 9, 10, 7] → 递归排序左右子数组


五、直接选择排序(Selection Sort)

步骤

  1. 在未排序序列中找到最小值
  2. 与未排序序列首元素交换
  3. 缩小未排序范围重复操作

C代码示例

void SelectionSort(int arr[], int n) {
    for (int i = 0; i < n-1; i++) {
        int min_idx = i;
        for (int j = i+1; j < n; j++)
            if (arr[j] < arr[min_idx]) 
                min_idx = j;
        int temp = arr[min_idx];
        arr[min_idx] = arr[i];
        arr[i] = temp;
    }
}

演算示例​(数组:[29, 10, 14, 37, 13]):
第1轮选10交换 → [10, 29, 14, 37, 13]
第2轮选13交换 → [10, 13, 14, 37, 29]


六、堆排序(Heap Sort)

步骤

  1. 构建最大堆
  2. 交换堆顶与末尾元素
  3. 调整剩余元素为最大堆
  4. 重复直到排序完成

C代码示例

void Heapify(int arr[], int n, int i) {
    int largest = i;
    int left = 2*i + 1;
    int right = 2*i + 2;
    if (left < n && arr[left] > arr[largest]) 
        largest = left;
    if (right < n && arr[right] > arr[largest])
        largest = right;
    if (largest != i) {
        int swap = arr[i];
        arr[i] = arr[largest];
        arr[largest] = swap;
        Heapify(arr, n, largest);
    }
}

void HeapSort(int arr[], int n) {
    for (int i = n/2 - 1; i >= 0; i--)
        Heapify(arr, n, i);
    for (int i = n-1; i > 0; i--) {
        int temp = arr[0];
        arr[0] = arr[i];
        arr[i] = temp;
        Heapify(arr, i, 0);
    }
}

演算示例​(数组:[4, 10, 3, 5, 1]):
构建最大堆 → [10, 5, 3, 4, 1] → 交换首尾后调整


七、基数排序(Radix Sort)

步骤

  1. 按个位分配到0-9的桶中
  2. 按顺序收集元素
  3. 重复上述过程处理十位、百位等高位

C代码示例

void RadixSort(int arr[], int n) {
    int max = arr[0];
    for (int i = 1; i < n; i++)
        if (arr[i] > max) max = arr[i];
    
    for (int exp = 1; max/exp > 0; exp *= 10) {
        int output[n];
        int count[10] = {0};
        
        for (int i = 0; i < n; i++)
            count[(arr[i]/exp)%10]++;
        for (int i = 1; i < 10; i++)
            count[i] += count[i-1];
        for (int i = n-1; i >= 0; i--) {
            output[count[(arr[i]/exp)%10]-1] = arr[i];
            count[(arr[i]/exp)%10]--;
        }
        for (int i = 0; i < n; i++)
            arr[i] = output[i];
    }
}

演算示例​(数组:[170, 45, 75, 90, 802, 24, 2, 66]):
个位排序 → 十位排序 → 百位排序 → 最终有序

0

评论区