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

    #include <stdio.h>
    #include <stdlib.h>
    
    //希尔排序
    //基本思想:也称为缩小增量排序;先分成多组,组的个数即增量的值;增量逐渐递减至1即组个数递减至1
    //时间复杂度:nlogn
    //增量t的取法:最初shell提出取increment=n/2向下取整,increment=increment/2向下取整,直到increment=1。
    //但由于直到最后一步,在奇数位置的元素才会与偶数位置的元素进行比较,这样使用这个序列的效率会很低。
    //后来Knuth提出取increment=n/3向下取整+1.还有人提出都取奇数为好,也有人提出increment互质为好。
    //应用不同的序列会使希尔排序算法的性能有很大的差异。
    
    //希尔排序思想+插入排序
    void ShellSort(int k[], int n)
    {
        int i, j, tmp;
        int step = n;
        do
        {
            step = step / 3 + 1;
            for (i = step; i < n; i++)
            {
                if (k[i] < k[i - step])
                {
                    tmp = k[i];
                    for (j = i - step; (j >= 0 )&&(k[j] > tmp); j -= step)
                    {
                        k[j + step] = k[j];
                    }
                    k[j + step] = tmp;
                }
            }
        } while (step > 1);
    }
    
    //希尔排序思想+冒泡排序
    void ShellSort2(int k[], int n)
    {
        int i, j, tmp;
        int step = n;
        do
        {
            step = step / 3 + 1;
            for (i = 0; i < n; i++)
            {
                for (j = i; j < n - step; j += step)
                {
                    if (k[j] > k[j + step])
                    {
                        tmp = k[j];
                        k[j] = k[j + step];
                        k[j + step] = tmp;
                    }
                }
            }
        } while (step > 1);
    }
    
    void print(int a[], int num)
    {
        int i = 0;
        for (i = 0; i < num; i++)
        {
            printf("%d ", a[i]);
        }
        printf("
    ");
    }
    
    int main()
    {
        int a[10] = { 2, 3, 56, 1, 4, 7, 8, 94, 3, 10 };
        int b[10] = { 2, 3, 56, 1, 4, 7, 8, 94, 3, 10 };
        print(a, 10);
        print(b, 10);
    
        ShellSort(a, 10);
        print(a, 10);
    
        ShellSort2(b, 10);
        print(b, 10);
    
        return system("pause");
    }
  • 相关阅读:
    python2和python3的区别
    开发常用命令
    类中的内置方法
    while 循环
    sql执行效率,explain 查询执行效率
    jmeter 中的 HTTP URL Re-writing Modifier
    jmeter beanshell内容
    jmeter 和 ajax
    jdbc 与 each controller 对多条查询结果的处理
    jdbc与 Beanshell PostProcessor 对多条结果的处理
  • 原文地址:https://www.cnblogs.com/henkk/p/11207563.html
Copyright © 2011-2022 走看看