考研之数据结构030_算法排序_交换排序_冒泡排序

在这里插入图片描述
交换排序:根据序列中两个元素关键字的比较结果来对换这两个记录在序列中的位置。

一、冒泡排序 :

1、算法思想(递增)稳定,数链都可

  • 从后往前(或者从前往后)两两比较两个相邻元素的值,若为逆序(A[i-1>A[i]),则交换它们,直到序列比较完。
  • 算法分析:

1、一共需要循环次数是:n-1
2、一共比较次数是:(n-1) + (n-2) + (n-3) +…+(1)

  • 1、第一次循环比较次数是n-1,循环的目的是为了相邻元素进行比较大小(例如1234,四个元素,只需要比较3次即可)。若果逆序,则进行交换。
  • 2、每次循环一次,会有一个最小(最大)元素产生。由于每次循环能确定一个元素最终位置,所以,下一次循环次数会减1。

3、可以在第一个fro循环后边,加入一个bool值,进行判断,如果调用,if语句后边的交换函数中bool值,则继续循环,若没有调用,则停止循环。

2、代码实现:

void swap(int &a,int &b){
    
    
	int temp;
	temp = a;
	a=b;
	b=temp;
}

void BubbleSort(int A[],int n){
    
    
    int i,j;
    for(i=0;i<n-1;i++) {
    
     		  //循环次数为n-1
		bool flag=false;	 //判断是否已经排序完成
		for(j=n-1;j>i;j--){
    
    		//比较的次数,n-1,n-2
			if(A[j-1]>A[j]){
    
    	//判断当前元素和前一元素是否逆序
				swap(A[j],A[j-1]);
				flag=true; 		
			}	
		}
		if(flag=false) return ;	//若循环一次没有进行交换,则排序成功
	}
}

在这里插入图片描述

3、时间复杂度0(n2)

在这里插入图片描述
最坏的情况下:交换次数和比较次数是一样的,也就是:

在这里插入图片描述

二、快速排序 (不稳定)

1、算法思想:

1、冒泡和快排:
冒泡排序:每次排序都后有一个最大/小元素,确定最终位置。
快速排序:每次排序都会有一个中间位置,确定最终位置。
PS:一次划分可以只能确定一个元素最终位置。
一趟排序,可能确定多个元素的最终位置。

2、思想:

  • 在一个数组中有几个元素,在排序表任意选一个元素作为枢轴(基准,通常取首元素),经过一趟排序后,可以确定该元素的最终位置,需要做的是:将表进行整个划分为该枢轴左右两个部分,左半部分比该元素小,有半部分比该元素大或等于

3、过程:

  • 用Low和high分别表示头和尾,选择low该元素作为基准元素,开始让low和high分别往中间移动,将所有元素,扫描一遍,停止条件是:两个l和h相等停止。将保证左半部分比该元素小,有半部分比该元素大或等于
    1.此时将low指向的元素为基准元素,则low指向的为空。
    2、那么让high所指的元素与基准元素进行比较,若大于基准元素,则不需要交换位置,high减一。若小于基准元素(说明需要将该元素放到基准元素的左边),则将该元素移动到Low所指向的空位置。那么此时的high所指向的位置为空。
    3、接下来让low所指的元素,与基准元素进行比较。若小于基准元素,则不需要交换位置,low加一。若该元素大于基准元素,则将该元素移动到hiwh所指向的空位置。此时的low所指的位置为空。
    4、重复2,3。直到两个l和h相等,就是确定了基准元素的最终位置。那么将基准元素放到low和high相等所指的元素。
    4.1 此次算法是运用递归调用,一个长度为8个元素的数组,第一次划分左右子表,则将继续进行此次划分的左字表,直到划分结束,在进行第一次划分结果的右子表。
    5、接下来,不需要管上一次基准元素了,只需要基准元素的左边和右边子表即可。继续用此方法进行划分,重复2,3
    5.1 左子表 : low等于:low —— high等于:基准减一

5.2 右子表 low等于:基准加1 —— high等于:high

在这里插入图片描述
5.3如果只剩下一个元素的索引为2,则low=pivotps +1=1 +1=2high=2,那么不符合while(L<H)循环。
5.3如果只剩下一个元素的索引为0,则low=0high=pivotps-1=1-1=0,那么不符合while循环。
解释low的由来:初始化设为low的值。
解释high的由来:pivotps=Partition()函数,而Partition函数的返回值是low或者hith(都相等),而l和h都是指向的是基准元素。

2、代码实现:

1、代码说明:
1.每一次while(low<high)循环,就是对基准元素左右划分明确,确定基准元素最终位置。

在这里插入图片描述

在这里插入图片描述

3、算法效率分析:

在这里插入图片描述

1、时间复杂度 O(n*递归层数)

在这里插入图片描述

在这里插入图片描述

2、空间复杂度

在这里插入图片描述

3、最坏情况:有序、逆序

在这里插入图片描述

三级目录

猜你喜欢

转载自blog.csdn.net/weixin_43989347/article/details/117513853