Bootstrap

选择排序与冒泡排序区别与比较

选择排序(select sort):

每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。

如果在 C 语言中去实现选择排序,我们最常见的就是两层循环的实现方式。从选择排序的思想出发,我们都不难看出:

  • 寻找最小的元素需要一层循环
  • 逐个被选出也是需要一层循环的

N-S图如下:
借鉴N-S图

算法如下:
for i = [0, n-2]
select min number from sortObjects after num[i]
if num[i] isnt the min number
swap the min number with num[i]

代码如下:

//选择排序
#include<stdio.h>
int main(){
	int a[10];
	int i=0,j,n=10,temp,max;
	/*while(scanf("%d",&a[i])!=EOF){
		scanf("%d",&a[i]);
		i++;
		n++;
	}*/
	for(i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	for(i=0;i<n;i++)
	{   
		max=i;
		for(j=i+1;j<n;j++)
		{
			if(a[j]>a[max]){  
				max=j;     //只保留下标
			}  
		}       
		        temp=a[i];
				a[i]=a[max];
				a[max]=temp;//将a[i+1]到a[10]中最大值与a[i]交换   
	}
	for(i=0;i<n;i++){
		printf("%d",a[i]);
		if(i!=n-1){
			printf(" ");
		}
	}
	printf("\n");
	return 0;
}


冒泡排序(bubble sort):

冒泡排序的基本思想是将数组中的每个相邻元素进行两两比较,按照小元素在前(或大元素在前)的原则确定是否进行交换。这样每一轮执行之后,最大(或最小)的元素就会被交换到了最后一位。
完成一轮之后,我们可以再从头进行第二轮的比较,直到倒数第二位(因为最后一位已经是被排序好的了)时结束。这样一轮之后,第二大(或第二小)的元素就会被交换到了倒数第二位。
同样的过程会依次进行,直到所有元素都被排列成预期的顺序为止。这个过程是不是很像是水中的起泡一个个冒起来的过程.

算法如下:
do
swaped = false
for i = 1 to indexOfLastUnsortedElement
if leftElement > rightElement
swap(leftElement, rightElement)
swapped = true
while swapped

如果在 C 语言中去实现冒泡排序,我们最常见的就是两层for循环的实现方式。
如果我们有 5个数待排序,我们可以会在程序中写出这样的片段:

for(j=0;j<5;j++){
  for(i=0;i<4-j;i++){
     swap(a[i],a[i+1];
  }
}

i和j都是用于作为数组索引的变量,swap是一个交换值的函数.


那么有没有发现两种排序方式的区别呢?

区别主要在交换的方式上

每一轮都把最大或最小的元素筛选出来放在相应的位置上
这是相同的
但是
对于每一轮
比如第一轮
要把1~n 中最大的那个放到n这个位置
冒泡法每次比较和移动相邻的两项
而选择排序每次交换当前项和第n项
我把代码写出来你就懂了:
冒泡:
for i:=1 to n-1 do
if (a[i]>a[i+1]) then swap(i,i+1);
选择:
for i:=1 to n-1 do
if (a[i]>a[n]) then swap(i,n);
(swap 表示交换)

总的来说,两种排序比较的次数是相同的
但交换的次数,选择排序是更少的
虽然两者的时间复杂度都是 O(n^2)
但通常,选择排序更快一点
冒泡排序是每一次都可能要交换
而选择排序是在比较时记下a[i]的位置 最后来交换
所以他们的交换过程是不一样的 而查找的过程是一样的
效率不会比冒泡的低…

;