快速排序与希尔排序——数据结构课程

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

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

     然后递归处理两个子序列,直到子序列长为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;
}
希尔排序

 

posted @ 2021-12-15 14:19  浪矢-CL  阅读(60)  评论(0编辑  收藏  举报