【算法】几种排序代码

54 篇文章 0 订阅
4 篇文章 0 订阅
#include<iostream>
#include<cstdlib>
using namespace std;
int ThreeMid(int * arr,int left,int right)
{
    int mid=left+((right-left)>>1);
    while (left<right)  
    {  
        if(arr[left]<arr[right])  
        {  
            if(arr[mid]<arr[left])  
                return left;  
            else if(arr[right]<arr[mid])  
                return right;  
            else  
                return mid;  
        }  
        if(arr[left]>arr[right])  
        {  
            if(arr[mid]<arr[right])  
                return right;  
            else if(arr[mid]>arr[left])  
                return left;  
            else  
                return mid;  
        }  
    }  
    return mid; 
}
void PopSort(int* arr,int len)
{
    for (int i=0;i<len;i++)
    {
        for(int j=i+1;j<len;j++)
        {
            if (arr[i]>arr[i+1])
            {
                int tmp=arr[i];
                arr[i]=arr[i+1];
                arr[i+1]=tmp;
            }
        }
    }
}
void selectSort(int* arr,int len)
{
    int min;
    int tmp;
    for(int i=0;i<len;i++)
    {
        for (int j=0;j<len;j++)
        {
            min=i;
            if(arr[min]>arr[j])
            {
                min=j;
            }
            tmp=arr[min];
            arr[min]=arr[j];
            arr[j]=tmp;
        }
    }
}
void selectSort2(int* arr,int len)
{
    int left=0;
    int right=len-1;
    while (left<right)
    {
        int min=left;
        int max=right;
        for(int i=left;i<=right;i++)
        {
            if (arr[min]>=arr[i])
            {
                min=i;
            }
            if(arr[max]<=arr[i])
            {
                max=i;
            }
        }
        swap(arr[left],arr[min]);
        if(left==max)
        {
            max=min;
        }
        swap(arr[right],arr[max]);
        left++;
        right--;
    }
}
void InsertSort(int* arr,int len)
{
    for(int i=1;i<len;i++)
    {
        int tmp=arr[i];
        int pos=i-1;
        while (pos>=0&&arr[pos]>tmp)
        {
            arr[pos+1]=arr[pos];
            pos--;

        }
        arr[pos+1]=tmp;
    }
}
void ShellSort(int* arr,int len)
{
    int gap=len/3+1;
    for (int i=gap;i<len;i++)
    {
        int tmp=arr[i];
        int pos=i-gap;
        while (pos>=0&&arr[pos]>tmp)
        {
            arr[pos+gap]=arr[pos];
            pos-=gap;
        }
        arr[pos+gap]=tmp;
    }
}
void FastSort(int* arr,int low,int high)
{
    if(low>=high)
        return;
    int first=low;
    int last=high;
    int mid=ThreeMid(arr,first,last);
    swap(arr[mid],arr[first]);
    int key=arr[first];
    while (first<last)
    {
        while (first<last&&arr[last]>=key)
        {
            --last;
        }
        arr[first]=arr[last];
        while (first<last&&arr[first]<=key)
        {
            ++first;
        }
        arr[last]=arr[first];
    }
    arr[first]=key;
    FastSort(arr,low,first-1);
    FastSort(arr,first+1,high);
}
int PartSort(int* arr,int first,int last)
{
    int left=first;
    int right=last;
    int key=ThreeMid(arr,first,last);
    swap(arr[key],arr[last]);
    int tmp=arr[last];
    while (left<right)
    {
        while (left<right&&arr[left]<=tmp)
        {
            ++left;
        }
        arr[right]=arr[left];
        while (left<right&&arr[right]>=tmp)
        {
            --right;
        }
        arr[left]=arr[right];
    }
    arr[left]=tmp;
    return left;

}
void QuickSort(int* arr,int first,int last)
{
    if (first<last)
    {
        int key=PartSort(arr,first,last);
        QuickSort(arr,first,key-1);
        QuickSort(arr,key+1,last);
    }
}
//快排优化,少于13个数用插入排序
void QuickSort2(int* arr,int first,int last)
{
    if (first<last)
    {
        if((last-first)>=13)
        {
        int key=PartSort(arr,first,last);
        QuickSort2(arr,first,key-1);
        QuickSort2(arr,key+1,last);
        }
        else
            InsertSort(arr,sizeof(arr)/sizeof(int));

    }
}
//归并排序
void Merge(int* arr,int* tmp,int first,int mid,int last)//归并
{
    int i=first;
    int j=mid+1;
    int k=first;
    while (i!=mid+1&&j!=last+1)
    {
        if(arr[i]>arr[j])
            tmp[k++]=arr[j++];
        else
            tmp[k++]=arr[i++];
    }
    while(i!=mid+1)
    {
        tmp[k++]=arr[i++];
    }
    while (j!=last+1)
    {
        tmp[k++]=arr[j++];
    }
    for(i=first;i<=last;i++)
        arr[i]=tmp[i];
}

void MergeSort(int* arr,int* tmp,int first,int last)//归并排序
{
    int mid;
    if (first<last)
    {
        mid= first+((last-first)>>1);          
        MergeSort(arr,tmp,first,mid);
        MergeSort(arr,tmp,mid+1,last);
        Merge(arr,tmp,first,mid,last);
    }
}
void Print(int *arr,int len)
{
    for(int i=0;i<len;i++)
    {
        cout<<arr[i]<<" ";
    }
    cout<<endl;
}
void test()
{
    int arr[]={9,3,5,1,4,7,8,0};
    int tmp[8];
    //int arr[]={2,3,6,5,4,13,56};
    cout<<"原数组  : ";
    Print(arr,sizeof(arr)/sizeof(arr[0]));
    InsertSort(arr,sizeof(arr)/sizeof(arr[0]));
    cout<<"插入排序: ";
    Print(arr,sizeof(arr)/sizeof(arr[0]));
    ShellSort(arr,sizeof(arr)/sizeof(arr[0]));
    cout<<"希尔排序: ";
    Print(arr,sizeof(arr)/sizeof(arr[0]));
    PopSort(arr,sizeof(arr)/sizeof(arr[0]));
    cout<<"冒泡排序: ";
    Print(arr,sizeof(arr)/sizeof(arr[0]));
    selectSort(arr,sizeof(arr)/sizeof(arr[0]));
    cout<<"选择排序: ";
    Print(arr,sizeof(arr)/sizeof(arr[0]));
    FastSort(arr,0,sizeof(arr)/sizeof(arr[0])-1);
    cout<<"快速排序: ";
    Print(arr,sizeof(arr)/sizeof(arr[0]));
    QuickSort(arr,0,sizeof(arr)/sizeof(arr[0])-1);
    cout<<"快速排序2: ";
    Print(arr,sizeof(arr)/sizeof(arr[0]));
    MergeSort(arr,tmp,0,sizeof(arr)/sizeof(arr[0])-1);
    cout<<"归并排序: ";
    Print(arr,sizeof(arr)/sizeof(arr[0]));
    QuickSort2(arr,0,sizeof(arr)/sizeof(arr[0])-1);
    cout<<"快速排序3:";
    Print(arr,sizeof(arr)/sizeof(arr[0]));
}
#include "Sort.h"
int main()
{
    test();
    system("pause");
    return 0;
}

这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值