【数据结构】排序

#include <bits/stdc++.h>

using namespace std;
//数据结构(考点):时空分析以及排序对应的优化等等知识点散但统一就那几个问题
//学习方法:仔细看课本,实在不行看B站视频动画模拟

//1简单直接排序
//2希尔排序
//3起泡排序
//4快速排序
//简单选择排序
//堆排序
//二路归并排序

//1依次将带排序序列的每个记录插入到已经排好的序列中知道全部序列都排好序
void insertsort(int r[],int n)
{
    int i,j;
    for(i=2;i<=n;i++)
    {
        r[0]=r[i];
        for(j=i-1;j>0&&r[0]<r[j];j--)
        {
            r[j+1]=r[j];
        }
        r[j+1]=r[0];
    }
}
//2希尔排序:先将整个待排序序列分割成若干子序列,在子序列中进行直接插入排列基本有序时再对整体进行直接插入排序
void shellsort(int r[],int n)
{
    int d,i,j,temp;
    for(d=n/2;d>=1;d=d/2)
    {
        for(i=d+1;i<=n;i++)
        {
            temp=r[i];
            for(j=i-d;j>0&&temp<r[j];j=j-d)
               r[j+d]=r[j];
            r[j+d]=temp;
        }
    }
}
//3起泡排序:每一趟都将最大的移动到最后,这里有一个优化的地方就是记录bound
void bubblesort(int r[],int n)
{
    int j,exchange,bound,temp;
    exchange=n;
    while(exchange!=1)//可以提前终止
    {
        bound=exchange;//赋值
        exchange=1;//置0
        for(j=1;j<=bound;j++)//起始位置不变,变的是终止bound
        {
            if(r[j]>r[j+1])
            {
                swap(r[j],r[j+1]);
                exchange=j;//每次交换位置记录
            }
        }
    }
}

//4快速排序:选择轴值,轴值左边小于等于轴值,则右边大于等于轴值
int sortpartition(int r[],int f,int l)
{
    int i=f,j=l,t;
    while(i<j)//左右只有指针碰头
    {
        while(i<j&&r[i]<=r[j]) j--;//首先左指针右移动
        if(i<j){
            swap(r[i],r[j]);
            i++;//进行下一个位置的标记
        }
        while(i<j&&r[i]<=r[j]) i++;//右指针左移动
        if(i<j){
            swap(r[i],r[j]);
            j--;
        }
    }
    return i;//记录轴值的最终位置
}
void quicksort(int r[],int f,int l)
{
    if(f>=l) return ;
    else {
        int p=sortpartition(r,f,l);
        quicksort(r,f,p-1);//对左边进行快排
        quicksort(r,p+1,l);//对右边进行快排
    }
}
//一节课剩下的这些 就没有写
//简单选择排序:在无序区中选择最小的和有序区域最后一个元素交换
//堆排序:堆的初始化,堆调整
//归并的递归
//归并非递归

int n=6;
int main()
{
    int r[7]={0,6,5,4,2,1,3};
    //insertsort(r,n);
    //shellsort(r,n);
    //bubblesort(r,n);
   //quicksort(r,1,n);

    for(int i=1;i<=n;i++) cout<<r[i]<<" ";
    cout<<endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值