各大排序算法



void selectSort(int q[])
{
    
    
    for(int i=0;i+1<q.size();i++)
    {
    
    
        int idx=i;
        for(int j=i+1;j<q.size();j++)
        {
    
    
            if(q[j]<q[idx])idx=j;
        }
        if(idx!=i)swap(q[i],q[idx]);
    }
}

void insertSort(int q[])
{
    
    
    for(int i=1;i<q.size();i++)
    {
    
    
        int t=q[i];
        for(int j=i-1;j>=0;j--)
        {
    
    
            if(q[j]>t)swap(q[j],q[j+1]);
            else break;
        }
        q[j+1]=t;
    }
}


void quickSort(int q[],int l,int r)
{
    
    
    if(l>=r)return;
    int t=q[l+r>>1];
    int i=l-1,j=r+1;
    while(i<j)
    {
    
    
        do i++;while(q[i]<t);
        do j--;while(q[i]>t);
        if(i<j)swap(q[i],q[j]);
    }
    quickSort(q,l,j),quickSort(q,j+1,r);
}


void mergeSort(int q[],int l,int r)
{
    
    
    if(l>=r)return;
    int m=l+r>>1;
    mergeSort(q,l,m),mergeSort(q,m+1,r);
    int k=0,i=l,j=m+1;
    while(i<=m && j<=r)
    {
    
    
        if(q[i]<=q[j])tmp[k++]=q[i++];
        else tmp[k++]=q[j++];
    }
    while(i<=m)tmp[k++]=q[i++];
    while(j<=r)tmp[k++]=q[j++];
    for(i=l,j=0;i<=r;i++,j++)q[i]=tmp[j];
    
}

void BubbleSort(int q[],int l,int r)//梳排序
{
    
    
    if(l>=r)return;
    for(int i=l;i<r;i++)
    {
    
    
        for(int j=i;j<r-i;j++)
        {
    
    
            if(q[j]>q[j+1])swap(q[j],q[j+1]);
        }
    }
}


void adjust_heap(vector<int>& nums,int x,int n){
    
    //桶排序
        int l=x*2+1;
        int r=x*2+2;
        int max=x;
        if(l<n&&nums[l]>nums[max])max=l;
        if(r<n&&nums[r]>nums[max])max=r;
        if(max!=x){
    
    
            swap(nums[max],nums[x]);
            adjust_heap(nums,max,n);
        }
    }
    void heap_sort(vector<int>& nums){
    
    
        int n=nums.size();
        for(int i=n/2-1;i>=0;i--){
    
    
            adjust_heap(nums,i,n);
        }
        for(int i=n-1;i>=0;i--){
    
    
            swap(nums[i],nums[0]);
            adjust_heap(nums,0,i);
        }
    }

void ShellSort(int A[],int n){
    
    
        //前后记录位置的增量 dk
        //增量dk 并逐步减小增量
        for(int dk=n/2;dk>0;dk/=2){
    
    
            //从第dk个元素,逐个对其所在组进行直接插入排序操作
            for(int i=dk;i<n;++i){
    
    
                int j=i;
                while(j-dk>=0&&A[j]<A[j-dk]){
    
    
                    //插入排序交换法
                    swap(A[j],A[j-dk]);
                    j-=dk;
                }
            }
        }
    }


 void InsertSort(int A[],int n){
    
    //折半插入排序
        int i,j=0;
        for(i=1;i<n;i++){
    
    
            int temp=A[i];
            low=1;
            high=i-1;
            while(low<high){
    
    
                mid=(low+high)/2;
                if(A[mid]>temp){
    
    
                    high=mid-1//查找左半子树
                }
                else
                    low=mid+1;
                for(j=i-1;j>high+1;--j){
    
    
                    A[j+1]=A[j];
                }
                A[high+1]=temp;
            }
        }


Guess you like

Origin blog.csdn.net/weixin_51928751/article/details/121312199