当前位置:   article > 正文

c语言插入排序算法:直接插入排序和希尔排序_c语言的插入算法

c语言的插入算法

(1)直接插入排序基本思想:将待排序的元素插入到已排好序的序列中的适当位置,直到所有元素都插入完毕。

1.功能代码:

  1. void insertionSort(int arr[], int n) {
  2. int i,j,key;
  3. //从第一个元素arr[0]开始遍历,到arr[n-1]结束,n为需要排序的元素个数
  4. for (i = 0; i < n; i++) {
  5. key = arr[i];
  6. j = i - 1;
  7. while (j >= 0 && arr[j] > key) {
  8. arr[j + 1] = arr[j];
  9. j = j - 1;
  10. }
  11. arr[j + 1] = key;
  12. }
  13. }

2.例题:将序列{4,5,1,2,6,3}进行快速排序

  1. #include"stdio.h"
  2. void insertionSort(int arr[], int n) {
  3. int i, key, j;
  4. for (i = 0; i < n; i++) {
  5. key = arr[i];
  6. j = i - 1;
  7. while (j >=0 && arr[j] > key) {
  8. arr[j + 1] = arr[j];
  9. j = j - 1;
  10. }
  11. arr[j + 1] = key;
  12. }
  13. }
  14. int main(){
  15. int arr[]={4,5,1,2,6,3};
  16. int i;
  17. insertionSort(arr,6);
  18. for(i=0;i<6;i++){
  19. printf("%d ",arr[i]);
  20. }
  21. return 0;
  22. }

(2)希尔排序:Shell Sort,是直接插入排序的一种改进版,也称为缩小增量排序(Diminishing Increment Sort),将一个序列分成若干个子序列分别进行直接插入排序,然后逐渐减小子序列的长度,最终整个序列就被排好序了。

具体实现步骤如下:

  1. 选择一个增量序列 t1,t2,……,tk,其中 ti > tj,tk = 1;

  2. 每次按增量序列对元素进行分组,对每组使用直接插入排序算法排序;

  3. 改变增量序列,重复第2步,直到增量序列为1。

  1. #include"stdio.h"
  2. void shell_sort(int arr[], int len) {
  3. int gap, i, j, tmp;
  4. for (gap = len / 2; gap > 0; gap /= 2) { // 分组
  5. for (i = gap; i < len; i++) { // 对每组进行直接插入排序
  6. tmp = arr[i];
  7. for (j = i - gap; j >= 0 && arr[j] > tmp; j -= gap) {
  8. arr[j + gap] = arr[j];
  9. }
  10. arr[j + gap] = tmp;
  11. }
  12. }
  13. }
  14. int main() {
  15. int arr[] = {50,26,38,80,70,90,8,30,40,20};
  16. int len = sizeof(arr) / sizeof(arr[0]);
  17. int i;
  18. printf("Before sorting:\n");
  19. for (i = 0; i < len; i++) {
  20. printf("%d ", arr[i]);
  21. }
  22. printf("\n");
  23. shell_sort(arr, len);
  24. printf("After sorting:\n");
  25. for (i = 0; i < len; i++) {
  26. printf("%d ", arr[i]);
  27. }
  28. printf("\n");
  29. return 0;
  30. }

  上述代码中,首先定义了一个 shell_sort 函数来实现希尔排序,其中 len 表示数组的长度,arr 表示需要排序的数组。在 shell_sort 函数中,使用 gap 变量来表示分组的间隔,每次将 gap 减半,直到 gap 为 1,表示最后对整个序列进行一次直接插入排序。在 for 循环中,使用 i 从 gap 开始遍历整个数组,对于每一个 i,都将其与前面 gap 个元素进行比较,进行直接插入排序。比较时,如果前面的元素大于当前元素,则将前面的元素后移 gap 个位置,直到找到合适的位置插入当前元素。最后,在 main 函数中对上述代码进行了简单的测试,并输出排序前后的数组。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/764253
推荐阅读
相关标签
  

闽ICP备14008679号