哪位大神能具体讲一下冒泡法和选择排序的用法,区别?
冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。
#include <stdio.h>
#define SIZE 8
void bubble_sort(int a[], int n);
void bubble_sort(int a[], int n)
{
int i, j, temp;
for (j = 0; j < n - 1; j++)
for (i = 0; i < n - 1 - j; i++)
{
if(a[i] > a[i + 1])
{
temp = a[i];
a[i] = a[i + 1];
a[i + 1] = temp;
}
}
}
int main()
{
int number[SIZE] = {95, 45, 15, 78, 84, 51, 24, 12};
int i;
bubble_sort(number, SIZE);
for (i = 0; i < SIZE; i++)
{
printf("%d", number[i]);
}
printf("\n");
}
选择排序每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)。
#include<stdio.h>
#include<stdlib.h>
void swap(int*a,int*b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
void select_sort(int A[],int n)
{
register int i,j,min,m;
for(i=0;i<n-1;i++)
{
min=i;//查找最小值
for(j=i+1;j<n;j++)
{
if(A[min]>A[j])
{
min=j;
}
}
if(min!=i)
{
swap(&A[min],&A[i]);
printf("第%d趟排序结果为:\n",i+1);
for(m=0;m<n;m++)
{
if(m>0)
{
printf("");
}
printf("%d",A[m]);
}
printf("\n");
}
}
}
int main(void)
{
int n;
while(scanf("%d",&n)!=EOF) /* VS2013等版本中需使用scanf_s(),VC6.0中使用scanf() */
{
int i;
int*A=(int*)malloc(sizeof(int)*n);
for(i=0;i<n;i++)
{
scanf("%d",&A[i]);
}
select_sort(A,n);
printf("最终排序结果为:\n");
for(i=0;i<n;i++)
{
if(i>0){
printf("");
}
printf("%d",A[i]);
}
printf("\n");
}
return 0;
}
区别就是 选择排序是扫描完整个数列后直接把最小的放到数列的第一位。
冒泡排序是在扫描过程中,遇到比前一个小的就直接互换位置。
用法直接度娘就行了 各个语言都有例子
区别就是冒泡排序的交换次数不会小于选择排序的交换次数
冒泡是两两比较,如果小就交换位置!!!
选择是每次选择最小的放在前面!!!
看了大神的回答,我才发现我把冒泡排序跟选择排序混为一谈了。。。。。受教了
自己去看看吧~~微博里的,有图有文字~!http://blog.csdn.net/chenlxhf/article/details/50880214
冒泡是两两之间的比较 选择排序是每次选择最小或者最大的元素
选择排序:第一次把整个待排空间的最小值求出来,然后与第一个数据交换位置。这样已排空间就有了第一个数据,之后重复该过程。
63 01 17 87 05 0763 17 87 05 0717 87 63 0787 63 1763 8787
冒泡排序:把第一个数据作为基准数据,与后面的数据进行对比,如果大于基准数据就交换位置,如果小于基准数据,就把基准数据变成当前的对比数据。
【63 01 17 87 05 07】
【01 63 17 87 05 07】
【01 17 63 87 05 07】63 和87比较 87大 所以从此处开始用87和后面的数据比较,63留在此处不动
【01 17 63 05 87 07】
【01 17 63 05 07 87】
【01 17 63 05 07】(87)
这两个算法的关键码比较次数都是由双重循环所决定,时间复杂度均为O(n*n),而且两个算法都是稳定的。
但是在数据量比较大时,选择排序效率比较高