以下是对七种经典排序算法的详细整理,包含步骤说明、C语言代码示例及具体演算过程:
一、直接插入排序(Straight Insertion Sort)
步骤:
- 将第一个元素视为已排序序列
- 取未排序部分的第一个元素,在已排序序列中从后向前扫描
- 找到合适位置插入,确保插入后序列仍有序
- 重复步骤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)
步骤:
- 选择增量序列(如
gap = n/2, gap /= 2
) - 对每个增量分组进行插入排序
- 缩小增量重复直到增量为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)
步骤:
- 比较相邻元素,若顺序错误则交换
- 每轮将最大元素"冒泡"到末尾
- 重复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)
步骤:
- 选取基准元素(如最后一个元素)
- 分区操作:将小于基准的放左侧,大于的放右侧
- 递归排序左右子数组
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)
步骤:
- 在未排序序列中找到最小值
- 与未排序序列首元素交换
- 缩小未排序范围重复操作
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)
步骤:
- 构建最大堆
- 交换堆顶与末尾元素
- 调整剩余元素为最大堆
- 重复直到排序完成
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)
步骤:
- 按个位分配到0-9的桶中
- 按顺序收集元素
- 重复上述过程处理十位、百位等高位
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]
):
个位排序 → 十位排序 → 百位排序 → 最终有序
评论区