zoukankan      html  css  js  c++  java
  • 快速排序与希尔排序——数据结构课程

    关于排序的两种算法,快速排序和希尔排序。

    快速排序:快速排序有种分治的思想,即先选定一个基准,然后以此基准将整个序列分为两个子序列,小于基准的都放到前面,大于基准的都放到后面。

         然后递归处理两个子序列,直到子序列长为1;算法时间复杂度为O(n*logn)。

    希尔排序:希尔排序则比较巧妙,其思想为逐渐缩小步长的过程中进行冒泡排序(也可进行直接插入排序)。其中步长的变化有很多种方法,我代码中是用的不断除2的方法,有牛人提出d[k] = 2^(t - k + 1) - 1,(1 <= t <= log2(n+1)),的增量序列。希尔排序也是一种不稳定的算法(在排序过程中数值相等的数据可能会改变位置)

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    using namespace std;
    #define Maxn 1024
    void Fastsort(int a[],int low,int high)
    {
        if(low>high) return;    
        int i=low;int j=high;
        int tmp=a[i];
        while(i<j)
        {        
            while(a[j]>=tmp&&j>i)    j--;
            a[i]=a[j];
            while(a[i]<=tmp&&j>i)    i++;
            a[j]=a[i]; 
        }
        a[i]=tmp; 
        Fastsort(a,low+1,i);
        Fastsort(a,i+1,high); 
    }
    int main()
    {
        int  a[Maxn];
        int n;
        printf("请输入要排序数据的个数\n");
        scanf("%d",&n);
        printf("请输入每个数据的大小\n");
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        Fastsort(a,1,n);
        for(int i=1;i<=n;i++)
            printf("%d ",a[i]);
        return 0;
    }
    快速排序
    #include<iostream>
    #include<cstdio>
    #include<cmath>
    using namespace std;
    #define Maxn 1024
    //希尔排序 步长缩短的过程中进行冒泡排序 
    void Hashsort(int a[],int n,int dt)
    {
        if(dt<1) return;    
        for(int i=1;i<=n;i+=dt)
        {
            int tmp;
            for(int j=1+dt;j<=n;j+=dt)
            {
                if(a[j]<a[j-dt])
                {
                    tmp=a[j];
                    a[j]=a[j-dt];
                    a[j-dt]=tmp;
                }
            }
        }
        Hashsort(a,n,dt/2);
    }
    int main()
    {
        int  a[Maxn];
        int n;
        printf("请输入要排序数据的个数\n");
        scanf("%d",&n);
        printf("请输入每个数据的大小\n");
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        Hashsort(a,n,n/4);
        for(int i=1;i<=n;i++)
            printf("%d ",a[i]);
        return 0;
    }
    希尔排序
  • 相关阅读:
    IIS: Idle Timeout vs Recycle
    Window.location
    Web technology for developersSee Web APIsStorage
    Know the basics about NTFS permissions
    设置描述性弹性域某个字段为只读
    adb root
    nvme WVLOCK
    模拟器获取root权限
    Android模拟器emulator基本使用技巧和命令
    人工智能可以产生自主意识吗
  • 原文地址:https://www.cnblogs.com/CLGYPYJ/p/15692595.html
Copyright © 2011-2022 走看看