数据结构与算法之交换排序

  交换排序,顾名思义,肯定是通过两个数或者几个数之间的比较和交换来达到排序的目的。基于交换的排序主要有冒泡排序快速排序

1、冒泡排序

通过两两之间的比较和交换,每次冒出一个最大的记录(升序)或者最小的记录(降序)。

复制代码
void bubbleSort(int arr[],int n){
    int outer,inner;
    for(outer=1;outer<=n;outer++){
        for(inner=1;inner<=n-outer;inner++){
            if(arr[inner+1]<arr[inner]){
                arr[0] = arr[inner];
                arr[inner] = arr[inner+1];
                arr[inner+1] = arr[0];
            }
        }
    }
}
复制代码

上述为常规的冒泡排序,但是如果最后面若干记录未发生交换,也就是后面的几个记录已经有序了,对于常规的冒泡排序,无论怎样都会进行冒泡,自然就增加了排序的时间。所以可对上述常规冒泡排序进行改进。如下:我们用一个exchangeIndex来记录每次交换的最后位置。

复制代码
void bubbleSortModified(int arr[],int n){
    int outer,inner;
    int exchangeIndex = n;
    int exchange;
    while(exchangeIndex>1){
        exchange = 1;
        for(inner=1;inner<=exchangeIndex;inner++){
            if(arr[inner+1]<arr[inner]){
                arr[0] = arr[inner];
                arr[inner] = arr[inner+1];
                arr[inner+1] = arr[0];
                exchange = inner;
            }
        }
        exchangeIndex = exchange;
    }
}
复制代码

2、快速排序

  快速排序:以序列中的某个记录为基准,把整个序列分成左右两组,左边序列小于基准,右边序列大于基准。然后对左右序列又选一个基准划分,依次下去直到左右序列的记录数为0。

复制代码
int _quickSort(int arr[],int begin,int end){
    arr[0] = arr[begin];
    while(begin < end){
        while(begin<end && arr[end]>arr[0])
          end --;
        if(begin<end)
          arr[begin] = arr[end],arr[end] = arr[0],begin ++;
        else 
          return begin;
        while(begin<end && arr[begin]<arr[0])
          begin ++;
        if(begin<end)
          arr[end] = arr[begin],arr[begin] = arr[0],end --;
        else
          return end;
    }    
}


void quickSort(int arr[],int begin,int end){
    int middle;
    if(begin < end){
        middle = _quickSort(arr,begin,end);
        quickSort(arr,begin,middle-1);
        quickSort(arr,middle+1,end);
    }
}
复制代码

3、总结

冒泡排序:时间复杂度o(n2),是稳定的排序算法。

快速排序:时间复杂度o(nlog2n),是不稳定的排序算法,所有排序算法中平均性能最好。

但是如果待排序序列本来就有序或者基本有序了,快速排序的性能会变得很差,它就退化成了冒泡排序,时间复杂度为o(n2)。所以快速排序适合那些随机序列的排序。

posted @   牛逼的码农  阅读(381)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示