排序算法之交换排序

交换排序的思想是,比较两个元素的大小,然后确定是否交换位置,主要分为两种

  • 冒泡排序
  • 快速排序
  1. 冒泡排序,依次比较相邻的两个元素,把最值放在头部或者尾部,接下来再用同样的方法取最值放在头部或尾部。代码如下
void bubbleSort(int a[], int n)
{
    int t;
    for(int i = n - 1; i >0; i--)
    {
        for(int j = 0; j < i; j++)
        {
            if(a[j]>a[j+1]){
                t = a[j];
                a[j] = a[j+1];
                a[j+1] = t;
            }
        }
    }
}
  1. 快速排序,首先设定一个分界值,然后通过分界值,将数组分成两部分,比如,一部分大于这个值,另一部分小于这个值。然后再从两部分中取分界值,递归操作。代码如下
// 递归实现
void quickSort(int arr[], int left, int right)
{
    int i = left;
    int j = right;
    int base = arr[i];
    if(left>=right)
        return;

    while(i<j){
        while(i<j && base < arr[j])
            j--;
        if(i<j)
            arr[i] = arr[j];

        while(i<j && base > arr[i])
            i++;
        if(i<j)
            arr[j] = arr[i];
    }

    arr[i] = base;
    quickSort(arr, left,i-1);
    quickSort(arr, i+1,right);
}
  1. 算法复杂度分析
  • 冒泡排序 平均复杂度O(N^2) 最坏时间复杂度O(N^2) 空间复杂度O(1) 稳定
  • 快速排序 平均复杂度O(NlogN) 最坏时间复杂度O(N^2) 空间复杂度O(NlogN) 不稳定

快速排序基于分治思想,log以2为底,一遍找元素O(N),一遍找位置O(logN)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值