交换排序---冒泡排序和快速排序

/*
名称:交换排序—冒泡排序和快速排序
说明:
对于冒泡排序来说,其相对来说简单些,每次比较把相邻的元素比较,把较小的移动到前面,总共比较n-1次。最终的时间复杂度为O(N2)。要注意一点的是,在编程实现冒泡排序的时候,如果某一趟排序时,元素之间并没有进行交换,则说明已经有序,则不用在进行接下来的排序。具体的做法是保存一个flag变量。冒泡排序是一个稳定的排序算法。

对于快速排序来说,它是交换排序的一个改进。是基于分治算法的。在冒泡排序中每趟排序已经产生了一些有序的短的自序列,而下一次排序时还要接着进行比较,从某种程度上说,这其实是一种浪费,应该可以用某种方式进行改进。快速排序就是一种改进的方法,它把每次划分,把比较的区间分为两部分,这样排序过程产生的短的有序序列在比较时就会减少很多。从而达到降低时间复杂度的效果。其最坏的时间复杂度是O(N2),最好的情况下是O(Nlog2N),平均情况接近与最好的情况。
还有,由于其是递归调用,所以需要占用一个递归工作栈。空间复杂度最高时O(N),初始序列已经是有序的情况,最低是O(log2(n)),平均是O(log2(n))。它是一个不稳定的排序算法。

*/

#include<iostream>
using namespace std;

//冒泡排序
void BubbleSort(int elem[],int n)
{
    bool flag  = false;     //用来当作是否此躺是否有交换的标志
    int temp = 0;
    for(int i = 0;i < n-1;++i)      //总共循环n-1躺,每次都把一个元素放到最终的位置上
    {
        flag = false;
        for(int j = n-1; j > i; --j)    //每趟循环j-i次
        {
            if(elem[j] < elem[j-1])     //如果比前面的小,就进行交换
            {
                temp = elem[j];
                elem[j] = elem[j-1];
                elem[j-1] = temp;

                flag = true;
            }
        }

        if( flag == false)      //如果此躺没有进行交换,则说明已经有序
                return ;

    }
}


//划分函数
int Partition(int elem[],int low,int high)
{
    int pivot = elem[low];         //子序列的第一个元素作为基准值

    while(low < high)
    {

        while(low < high && elem[high] > pivot)     //将比基准值小的元素移动到左端
            --high;

        elem[low] = elem[high];

        while(low < high && elem[low] < pivot)      //将比基准值大的元素移动到右端
            ++low;

        elem[high] = elem[low];


    }

    elem[low] = pivot;          //基准值最后的位置

    return low;         //返回最终基准的位置
}



//快速排序
void QuickSort(int elem[],int low,int high)
{
    if(low < high)
    {
        int pivort = Partition(elem,low,high);      //划分子区间
        QuickSort(elem,low,pivort-1);       //递归调用左半边的区间
        QuickSort(elem,pivort+1,high);      //递归调用右半边的区间
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值