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;
    }
    希尔排序
  • 相关阅读:
    【校招面试 之 C/C++】第23题 C++ STL(五)之Set
    Cannot create an instance of OLE DB provider “OraOLEDB.Oracle” for linked server "xxxxxxx".
    Redhat Linux安装JDK 1.7
    ORA-10635: Invalid segment or tablespace type
    Symantec Backup Exec 2012 Agent for Linux 卸载
    Symantec Backup Exec 2012 Agent For Linux安装
    You must use the Role Management Tool to install or configure Microsoft .NET Framework 3.5 SP1
    YourSQLDba介绍
    PL/SQL重新编译包无反应
    MS SQL 监控数据/日志文件增长
  • 原文地址:https://www.cnblogs.com/CLGYPYJ/p/15692595.html
Copyright © 2011-2022 走看看