冒泡排序和快速排序

冒泡排序:
排序过程像是水中的气泡上升,越大的气泡升的越快,所以叫冒泡排序,从第一个数据开始,让前后相邻的数据进行比较,如果Ki>Ki+1则交换它们,每一趟排序完成一个数据,反复这个过程,直接待排序的数据为1,则结束排序。

​ 和经典排序相比,冒泡排序对数据的有序性敏感,如果一趟排序没有发生交换,则说明所前面的数据都比它的后继数据要小,则可以立即停止,提前结束排序。

​ 注意:如果待排序的数据基本有序,则使用冒泡排序速度最快,因为它数据的有序性敏感可以提前结束。

// 最优时间复杂度:O(N),最差时间复杂度:O(N^2),平均时间复杂度:O(N^2),空间复杂度:O(1),稳定性:稳定
void bubble_sort(int* arr,size_t len)
{
    bool flag = true;
    for(int i=len-1; flag&&i>0; i--)
    {
        flag = false;
        for(int j=0; j<i; j++)
        {
            if(arr[j] > arr[j+1])
            {
                swap(arr[j],arr[j+1]);
                flag = true;
            }   
        }   
    }   
}

快速排序:
先在待排序的序列中找出一个标杆,然后与剩余的数据进行比较,比标杆小的数据放在标杆的左边,比标杆大的数据放在它右边,这样就做到以标杆为准的大致有序,然后再次同样的方法对标杆左边的数据进行排序、标杆右边的数据进行排序,直到整个序列完全有序。

注意:快速排序之所以叫快速排序,综合各种情况它的表示最好,速度最快,如果对待排序的数据不了解,建议优先选择快速排序。

// 时间复杂度:O(NlogN),空间复杂度:O(1),稳定性:不稳定
void _quick_sort(int* arr,int left,int right)
{
    // 备份左右边界
    int l = left, r = right;
    // 把最右边的数据作为标杆,前记录标杆下标
    int pv = arr[left], pi = left;

    while(l<r)
    {
        // 从右向左寻找比标杆小的数据
        while(l<r && arr[r]>=pv) r--;
        // 找到比标杆小的数据
        if(l<r)
        {
            // 把它移动标杆的左边
            arr[pi] = arr[r];
            // 记录标杆的新位置
            pi = r;
        }
        // 从左向右寻找比标杆大的数据
        while(l<r && arr[l]<=pv) l++;
        // 打到比标杆大的数据
        if(l<r)
        {
            // 把它移动到标杆的右边
            arr[pi] = arr[l];
            // 记录标杆的新位置
            pi = l;
        }
    }
    // 把标杆的值存放到最新位置
    arr[pi] = pv;

    // 快速排序标杆左边的数据
    if(pi-left>1)
        _quick_sort(arr,left,pi-1);
    // 快速排序标杆右边的数据
    if(right-pi>1)
        _quick_sort(arr,pi+1,right);
}
void quick_sort(int* arr,size_t len)
{
    _quick_sort(arr,0,len-1);
}

相关文章

显卡天梯图2024最新版,显卡是电脑进行图形处理的重要设备,...
初始化电脑时出现问题怎么办,可以使用win系统的安装介质,连...
todesk远程开机怎么设置,两台电脑要在同一局域网内,然后需...
油猴谷歌插件怎么安装,可以通过谷歌应用商店进行安装,需要...
虚拟内存这个名词想必很多人都听说过,我们在使用电脑的时候...