哪位大神能具体讲一下冒泡法和选择排序的用法,区别?
8条回答
- 小灸舞 2016-05-04 07:55关注
冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。
#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; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报