希尔排序的算法设计与分析
问题描述:设计并分析希尔排序算法
【算法设计思想】
- 选择一个初始的增量序列,通常选择数组长度的一半(n/2)作为初始增量。
- 对于每个增量,将数组分割成若干个子序列,每个子序列的长度等于当前增量。例如,如果增量为 5,那么数组将被分割成长度为 5 的子序列。
- 对每个子序列进行插入排序。插入排序的基本思想是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。
- 逐步缩小增量,重复步骤 2 和 3,直到增量为 1。此时,整个数组已经变成有序序列。
【算法描述】
void shell_sort(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;
}
}
}
【完整的测试程序】
#include<stdio.h>
void shell_sort(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;
}
}
}
int main() {
int arr[] = {12, 34, 54, 2, 3};
int n = sizeof(arr) / sizeof(arr[0]);
printf("原始数组:\n");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
shell_sort(arr, n);
printf("排序后的数组:\n");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
标签:arr,排序,temp,int,增量,gap,希尔,printf,数据结构
From: https://www.cnblogs.com/zeta186012/p/18229236