排序算法总结(C++实现)

排序算法总结(C++实现)

思想总结:

冒泡排序

对一个数组进行一趟遍历,当当前遍历的数字比后一个数字大的时候,两数字交换,这样遍历一遍之后,会将最大的数字放置到数组的最后端;第二次,将倒数第二大的数字放到数组的倒数第二个位置,,,;遍历arr.length次之后,就实现了从小到大的排序。

选择排序

选择排序的中心思想是将为每一个位置选出合适的数字,仍旧遍历数组,第一次遍历时,选出最小的数字,即每次将当前遍历得到的最小的数字的数组下标记录下来,和之后的数字进行对比,最终得到数组中最小的数字的下标,之后将该数字与第一个数字进行交换;开始第二次遍历,选出剩余数字中最小的数字,放到第二个位置,,,;这样遍历arr.length次之后,就为每一个位置选出了合适的数字。

插入排序

插入排序就是将数组分为两部分,前一部分为已经排好序的数组,后一部分为未排序的数组;从第一个数字开始,将第一个数字作为已排好序的数组,选取排好序数组的下一个数字作为待排序数字,与已经排好序的数组中的数字从后到前进行进行对比,若待排序数字小于所对比数字,则将该数字后移一位,指导待排序数字大于所选数字,停止往前对比,结束循环,将待排序数字放入该数字之后;然后选取下一个待排序数字,进行对比,,,,;最终将所有未排序数字排序完成即可。

快速排序

快速排序主要是应用递归的思想,在每一趟遍历的时候,选取一个标准值,将数组不断地分成大于标准值和小于标准值的两部分,然后对着两部分再进行遍历,,,,;具体的实现方式是,每次遍历取出第一个值作为标准值,然后从后往前,将每个值与标准值进行对比,若该值大于等于标准值,则顺序对比前一个值,直至对比完成,反之则结束循环,将该值存到之前标准值取值的位置(请记住这一点,因为当你去取出标准值的时候,相当于此处为空了,所以可以将该值放置到此处);然后再从前往后,将每个值与标准进行对比,做该值小于等于标准值,则顺序对比后一个值,直至对比完成,反之则结束循环,将该值存到上一次从后往前对比时调整的数字位置,,,,;这样一直进行循环,直至遍历完每一个数字,最后结束遍历之后,将标准值再存入数组中,此时标准值左侧的数字全部小于标准值,右侧的数字全部大于标准值;然后对这两部分再次进行快速排序,,,,;
该算法的实现个人认为较为难与想象,建议手动取一个数组,在对数组进行手动模拟算法过程,以此来增强理解。

归并排序

归并排序就是将一个待排序的数组不断的二分成两个小的数组,然后再对两个数组进行进一步的二分,将两个数组进行排序,之后在统一整合到原数组中,一步一步递归,得到排好序的数组。

代码实现如下


#include <iostream>

using namespace std;

class mySort
{
public:
    int arr[];


    /*冒泡排序*/
public:
    void Bubble_sort()
    {
        int a,b;
        int arr[100];
        cin>>a;
        for(int i=0;i<a;i++)
        {
            cin>>arr[i];
        }
        for(int i=0;i<a-1;i++)
        {
            for(int j=0;j<a-i-1;j++)
            {
                if(arr[j]>arr[j+1])
                {
                    b=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=b;
                }
            }
        }
        for(int i=0;i<a;i++)
            cout<<arr[i];
    }

    /*选择排序*/
public:
    void Selection_sort()
    {
        int a,b,c=0,m;
        int arr[100];
        cin>>a;
        for(int i=0;i<a;i++)
        {
            cin>>arr[i];
        }
        for(int i=0;i<a;i++)
        {
            b=i;
            for(int j=i+1;j<a;j++)
            {
                if(arr[b]>arr[j])
                {
                    b=j;
                }
            }
            m=arr[b];
            arr[b]=arr[i];
            arr[i]=m;
        }
        for(int i=0;i<a;i++)
        {
            cout<<arr[i];
        }
    }

    /*插入排序*/
public:
    void Insertion_sort()
    {
        int a,b;
        int arr[100];
        cin>>a;
        for(int i=0;i<a;i++)
        {
            cin>>arr[i];
        }
        for(int i=0;i<a;i++)
        {
            int flag=arr[i+1];
            int j=i+1;
            while (flag<arr[j-1]&&j>0)
            {
                arr[j]=arr[j-1];
                j--;
            }
            arr[j]=flag;
        }
        for(int i=0;i<a;i++)
            cout<<arr[i];
    }


    /*快速排序*/
public:
    void Quick_sort(int arr[],int a,int b)
    {
        if(a>=b)
            return;
        int low=a,heigh=b;
        int key=arr[low];
        while(low<heigh)
        {
            while(low<heigh && arr[heigh]>=key)
                --heigh;
            arr[low] = arr[heigh];
            while (low<heigh && arr[low]<=key)
                ++low;
            arr[heigh] = arr[low];
        }
        arr[low] = key;
        Quick_sort(arr,a,low-1);
        Quick_sort(arr,low+1,b);
    }



    /*归并排序*/
public:
    void Merge_sort(int *A,int x,int y,int *T)
    {
        if(y-x >1)
        {
            int m=(x+y)/2;
            int p=x,q=m,i=x;
            Merge_sort(A,x,m,T);
            Merge_sort(A,m,y,T);
            while (p<m||q<y)
            {
                if(q>=y||(p<m&&A[p]<=A[q]))
                    T[i++]=A[p++];
                else T[i++]=A[q++];
            }
            for(i=x;i<y;i++)
                A[i]=T[i];
        }
    }

};


int main()
{
    mySort a;
    //a.Bubble_sort();
    //a.Selection_sort();
    //a.Insertion_sort();

    int in;
    int arr[100],T[100];
    cin>>in;
    for(int i=0;i<in;i++)
    {
        cin>>arr[i];
    }
    /*a.Quick_sort(arr,0,in-1);*/
    a.Merge_sort(arr,0,in-1,T);
    for(int i=0;i<in;i++)
        cout<<arr[i];


    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值