8-17复习完计算机组成原理第二章后对数据结构代码进行复习

void InsertSort(int a[],int n)//一发入魂,完美
{
    for(int i=1;i<n;i++)
    {
        int t=i;
        for(int j=i-1;j>=0&&a[j]>a[t];--j)
        {
            swap(a[j],a[t]);
            t=j;
        }
    }
}一趟排序可以使部分有序(即已排序部分,但是一趟排序不能确定最终位置

插入排序+二分查找(因为部分有序所以可以使用二分啊

void insertsort2(int a[],int n)
{
    for(int i=1;i<n;i++)
    {
        if(a[i-1]>a[i])
        {
            int low,high,mid,temp=a[i];
            for(low=0,high=i-1,mid=(high+low)/2;low<=high;mid=(high+low)/2)
            //注意终止判断条件以及循环更新哪个变量。
            //停止条件不用保证a[mid]>temp这种,且每次循环后要更新mid
            if(a[mid]>temp) high=mid-1;
            else low=mid+1;
            for(int j=i-1;j>=low;--j) a[j+1]=a[j];
            a[low]=temp;
        }        
    }
}

一发入魂

void BubbleSort(int a[],int n)//done
{
    for(int i=0;i<n-1;i++)
    {
        bool ischanged = false;
        for(int j=n-1;j>i;--j)
        {
            if(a[j]<a[j-1])
            {
                swap(a[j],a[j-1]);
                ischanged=true;
            } 
        }
        if(!ischanged) break;//即本次遍历无数据移动,数组已有序。
    }
}

一发入魂

void ShellSort(int a[],int n)
{
    int i,j,temp;
    for(int s=n/2;s>=1;s=s/2)//每次遍历之后更改步长。
    {        
        for(i=s;i<n;++i)
        {
            if(a[i]<a[i-s])
            {
                temp = a[i];
                for(j=i-s;j>=0&&a[j]>temp;j-=s) a[j+s]=a[j];
                a[j+s]=temp;                
            }
             
        }
    }
}

①快排里的划分函数第一趟写的时候没注意循环里的判断溢出条件,导致程序越界。注意循环里也要判断越界哦!!!
②还有就是,自己写的这个快排是取闭区间的即 x∈[low,high]

int portition(int a[],int low,int high)
{
    int pivot = a[low],lef=low,rig=high;
    while(lef<rig)
    {
        while(lef<rig&&a[rig]>pivot)rig--;//注意循环内也要防止越界哦
        a[lef]=a[rig];
        while(lef<rig&&a[lef]<pivot)lef++;
        a[rig]=a[lef];
    }
    a[lef]=pivot;
    return lef;
}

void QuickSort(int a[],int low,int high)//上下界为闭区间 x ∈ [low,high]
{
    if(low>high) return;
    int pivots=portition(a,low,high);
    QuickSort(a,low,pivots-1 );
    QuickSort(a,pivots+1,high);
}

堆排序里他的cmp条件一定得是>=不然会error,或者死循环(明明我的测试数据里面没有重复的数据😣😣)

void HeadAdjust(int a[],int k,int n)
{
    int temp = a[k];
    for(int i=2*k;i<n;i*=2)
    {
        if(i+1<n&&a[i+1]>a[i]) i=i+1;
        if(a[i]<=temp) break;	//cmp
        //此处一定要大于等于?否则会error
        a[k]=a[i];
        k=i;
    }
    a[k]=temp;
}

void IniHugeDickHeap(int a[],int n)
{
    for(int i=n/2;i>=0;--i) HeadAdjust(a,i,n);
}

void HeapSort(int a[],int n)
{
    IniHugeDickHeap(a,n);
    for(int i=n-1;i>=0;--i)
    {
        swap(a[0],a[i]);
        HeadAdjust(a,0,i);
    }
}

归并排序的主程序要先进行分治(递归,把大的问题分成小的子问题),再进行计算。

void Merge(int a[],int low,int mid,int high)
{
    int i,p1=low,p2=mid+1,*b=new int [100];
    for(int i=low;i<=high;++i) 
        b[i]=a[i];//拷贝数组
    for(i=low;p1<=mid&&p2<=high;++i)
    {
        if(a[p1]<=a[p2]) b[i]=a[p1++];//确保稳定性
        else b[i]=a[p2++];
    }
    while(p1<=mid)  b[i++]=a[p1++];
    while(p2<=high) b[i++]=a[p2++];
}

void MergeSort(int a[],int low,int high)
{
    if(low>high) return;
    int mid = (low+high)/2;
    MergeSort(a,low,mid);
    MergeSort(a,mid+1,high);
    //先分治,当子问题都解决了再来解决大的问题
    Merge(a,low,mid,high);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值