我是靠谱客的博主 坦率保温杯,最近开发中收集的这篇文章主要介绍【数据结构】内部排序- -交换排序小结(冒泡排序、快速排序),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

交换排序

    • 1 冒泡排序
      • 1.1 思想:
      • 1.2 算法分析
      • 1.3 代码
    • 2 快速排序
      • 2.1 思想
      • 2.2 算法分析
      • 2.3 代码

交换排序是指根据关键字比较结果来对换序列中的位置。

1 冒泡排序

1.1 思想:

(BubbleSort)像小鱼吐泡泡一样,吐出后飘呀飘,泡泡慢慢变大。从后往前(或者从前往后)两两比较,只要较小元素,然后接着比,最后结果就是最小元素冒到最前面(最大元素冒到最后面),第一趟结束。至多n - 1 趟就能排好所有元素。若某趟结束后没得交换,说明已经有序,冒泡结束。

  • 冒泡排序产生的有序子列在全局中仍是有序的。也就是说,一趟都至少能确定一个元素的最终位置。
  • 过程如下
    冒泡排序过程图

1.2 算法分析

  • 稳定性:稳定
  • 空间复杂度:O(1)
  • 与初态是否有关:有关
  • 顺序存储 + 链表结构
  • 时间复杂度:
    最好时间复杂度:O(n)
    最坏时间复杂度:O( n^2)
    平均时间复杂度:O(n^2)

关于时间复杂度:最好的情况就是初始序列正序,此时只需比较 n - 1 次,无须移动,时间复杂度O(n);最坏的情况就是初始序列逆序,既要比较又要移动元素。

1.3 代码

//这里是冒泡排序
void BubbleSort(ElemType A[],int n)
{
    for(int i = 0; i<n-1;i++)//从后往前两两比较相邻元素的值,进行n-1趟
    {
        flag=false;//设置标志位,因为当未发生元素交换,即标志位未变,说明序列已有序,冒泡结束。
        for(j=n-1;j>i;j--)//一趟冒泡排序,下标从0开始,n-1为止,因此for循环从n-1开始。
        {
            if(A[j-1]>A[j]//将小元素冒到前面,若前面的比后面大,交换。
            {
               swap(A[j-1],A[j]);
               flag=true;//发生了交换,序列还未有序
            }
        }
        if(flag == false)
             return 0;
    }
}

2 快速排序

2.1 思想

使用 low、high、pivot 三个指针,从两头向中间按一定规则靠拢,以pivot 作为基准(又称枢轴),得到这样的结果:pivot左边是小于基准的元素,右边是大于基准的元素。

  • 快排是所有内部排序算法中平均性能最吊的;
  • 快排基于分治法,是一个交替搜索和交换的过程;
  • 关键是在于划分,也直接关系到算法性能;
  • 是递归的,其时间复杂度和空间复杂度也与递归调用的深度一致;(树的深度)
  • 最终将基准元素放到应在的位置,不产生有序子序列;
  • 越乱性能越优,正序逆序反而性能很差;
  • 排序过程如下:
    快速排序过程图
    在这里插入图片描述

2.2 算法分析

  • 稳定性:不稳定
  • 空间复杂度:O(log n)
  • 与初态是否有关:有关
  • 顺序存储,不宜使用链表
  • 时间复杂度:
    最好时间复杂度:O(n log n)
    最坏时间复杂度:O( n^2)
    平均时间复杂度:O(n log n)

2.3 代码

//快速排序
//将第一个元素作为基准,把待排序列划分左右两个部分
int Partition (ElemType A[], int low, int high)
{
	ElemType pivot = A[low];// 将第一个元素作为枢轴,存储起来,防止覆盖
	while(low < high)
    {
    	while(low < high && A[high] >= pivot)
    	//从最右边开始,依次比较基准和A[high]的值,直至基准元素大时,交替左侧;
    		- -high;//先取值,再 —1
         A[low] = A[high];
        while (low < high && A[low] <= pivot)
        //从最左边开始,依次比较基准和A[low]的值,直至基准元素小时,交替右侧;
            ++low;//先取值,再 +1
         A[high] = A[low];
     }
    A[low] = pivot;//low 与 high 的值相同,正是基准元素应该在的位置
    return low;
}

void QuickSort(ElemType A[],int low, int high)
{
	if( low < high)
   {
   		int pivotpots = Partition( A, low,high);
   		QuickSort(A, low, pivotpots-1);//划分左子表
    	QuickSort(A, pivotpots+1, high);
   }
}

最后

以上就是坦率保温杯为你收集整理的【数据结构】内部排序- -交换排序小结(冒泡排序、快速排序)的全部内容,希望文章能够帮你解决【数据结构】内部排序- -交换排序小结(冒泡排序、快速排序)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部