希尔排序过程模拟

本文介绍了希尔排序的原理,并提供了作者自编的取半版本实现。通过详细步骤解析,帮助读者理解这种高效的排序方法。
摘要由CSDN通过智能技术生成
希尔排序(Shell's Sort)是 插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因D.L.Shell于1959年提出而得名。
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组, 算法便终止。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是希尔排序和两种快速排序的 C 语言实现代码: ### 希尔排序 ```c void shellSort(int arr[], int n) { for (int gap = n/2; gap > 0; gap /= 2) { for (int i = gap; i < n; i += 1) { 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; } } } ``` ### 快速排序 #### 递归实现 ```c void swap(int* a, int* b) { int t = *a; *a = *b; *b = t; } int partition(int arr[], int low, int high) { int pivot = arr[high]; int i = (low - 1); for (int j = low; j <= high- 1; j++) { if (arr[j] < pivot) { i++; swap(&arr[i], &arr[j]); } } swap(&arr[i + 1], &arr[high]); return (i + 1); } void quickSort(int arr[], int low, int high) { if (low < high) { int pi = partition(arr, low, high); quickSort(arr, low, pi - 1); quickSort(arr, pi + 1, high); } } ``` 在这段代码中,`arr` 是待排序的数组,`low` 和 `high` 分别是数组的起始位置和结束位置。 首先,我们选择数组中的一个元素作为枢轴值(pivot),并将数组分为两部分,一部分小于枢轴值,一部分大于枢轴值。然后递归地对这两部分进行快速排序。 在 `partition` 函数中,我们选择数组最后一个元素作为枢轴值,然后遍历数组,将小于枢轴值的元素放到数组的左边,将大于枢轴值的元素放到数组的右边。最后,将枢轴值放到合适的位置,使得左边的元素都小于枢轴值,右边的元素都大于枢轴值。返回枢轴值的位置,即分割点。 在 `quickSort` 函数中,我们首先判断数组的长度是否大于 1,如果是,则选择一个枢轴值,将数组分为两部分,并递归地对这两部分进行快速排序。 #### 迭代实现 ```c void swap(int* a, int* b) { int t = *a; *a = *b; *b = t; } void quickSort(int arr[], int n) { int stack[n]; int top = -1; stack[++top] = 0; stack[++top] = n - 1; while (top >= 0) { int high = stack[top--]; int low = stack[top--]; int pivot = arr[high]; int i = (low - 1); for (int j = low; j <= high- 1; j++) { if (arr[j] < pivot) { i++; swap(&arr[i], &arr[j]); } } swap(&arr[i + 1], &arr[high]); int pi = (i + 1); if (pi - 1 > low) { stack[++top] = low; stack[++top] = pi - 1; } if (pi + 1 < high) { stack[++top] = pi + 1; stack[++top] = high; } } } ``` 在这段代码中,我们使用一个栈来模拟递归实现的快速排序。首先,将整个数组的起始位置和结束位置压入栈中。然后,循环取出栈顶的两个位置,选择一个枢轴值,将数组分为两部分,并将子数组的起始位置和结束位置分别压入栈中。重复以上步骤,直到栈为空,排序完成。 这种迭代实现的快速排序算法称为非递归快速排序(Non-recursive QuickSort)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值