zoukankan      html  css  js  c++  java
  • 排序算法07----------------------希尔排序

    1.希尔排序

      希尔排序是对直接插入排序的一种改进,基本思想是隔一定间隔取元素组成一组元素,然后对这组元素进行直接插入排序,所有元素排序完一次后。间隔减少,再进行同样的操作,直到间隔变为1,这时就是直接插入排序了,因为经过前面的步骤,元素大多数都是有序了,直接插入排序,对有序序列的效率是很高的。

    2.步骤

      1)首先取间隔gap,一般取gap=n/2,下面是8个元素进行一次排序后的结果。

        每隔4个元素取一个元素组成一组,然后进行直接插入排序。

      

      2)然后间隔gap=gap/2

      

       3)再取一次gap=gap/2 gap就为1,就是直接插入排序了

    3.代码

      代码其实不难,就是直接插入排序算法嵌套一层间隔循环

      

     1 #include<stdio.h>
     2 //希尔排序 
     3 void shellSort(int * arr,int num)
     4 {
     5     int i,j,k;
     6     int temp,gap;
     7     //间隔每次除2 
     8     for(gap=num/2;gap>0;gap/=2)
     9     {    
    10         //直接插入排序算法 
    11         for(k=gap;k<num;k++)
    12         {
    13             temp=arr[k];
    14             j=k-gap;
    15             while(j>=0&&arr[j]>temp)
    16             {
    17                 arr[j+gap]=arr[j];
    18                 j-=gap;
    19             }
    20             arr[j+gap]=temp;
    21         }
    22     }
    23 }
    24 int main()
    25 {
    26     int i; 
    27     int arr[10]={1,3,-9,0,10,2,8,9,19,-1};
    28     shellSort(arr,10);//希尔排序
    29     for(i=0;i<10;i++)
    30         printf("%d
    ",arr[i]);
    31     return 0;
    32 } 

     希尔排序算法的时间复杂度O(n^1.3到n^2)

  • 相关阅读:
    nginx + keepalived 教程
    mysql 之 获取指定月份天数和指定月份上月天数
    hive 之将sql执行结果输出到文件中
    sql 之 处理一行全为0的记录
    Shell 基础知识
    kettle 调度时出现时区问题,导致数据调出加了8小时
    sql 之按指定分割符取分割符前/后字符串
    Spring Security(二)
    Spring Security(一)
    集成Swagger文档
  • 原文地址:https://www.cnblogs.com/duichoumian/p/12685403.html
Copyright © 2011-2022 走看看