冒泡数据排序算法
01 | /* 冒泡法是数据排序的一种基本算法,它的基本方法是:相邻两元素进行比较,如有需要则进行交换, |
02 | 每完成一次循环就将最小元素排在最后(如从大到小排序),下一次循环是将其他的数进行类似操作? |
03 | 如将N 个数按从大到小排序,Turbo C语言程序函数 |
04 | 如下: */ |
05 | |
06 | void sort( int a[], int n); |
07 | main() |
08 | { |
09 | int a[100],i ,j ,n ; |
10 | |
11 | /*输入数组元素的个数及各元素的值*/ |
12 | scanf ("%d",&n); |
13 | for (i =0;i <n ;i ++ ) scanf ("%d",&a [i]); |
14 | sort(a,n); |
15 | for (i =0;i <n ;i ++ ) printf ("%d",a[i]); |
16 | |
17 | } |
18 | sort( int a[], int n) |
19 | { |
20 | int i ,j ,t ; |
21 | for (i =n -2;i >=0; i--) |
22 | for (j =0;j <i ; j++) |
23 | if (a[j]<a[j +1]) |
24 | { |
25 | t =a[j]; |
26 | a[j]=a[j +1]; |
27 | a[j +1]=t ; |
28 | } |
29 | } |
30 | |
31 | /*N 个元素需比较N *(N -1)/2次,效率较差?其实,可根据每一次循环比较中的情 |
32 | 况改进之? [改进一]:若某次循环中没有数据交换过,则可认为数据已经有序了, |
33 | 不必再进行循环了,可在程序中设一变量Flag 用来标识有无数据交换? */ |
34 | |
35 | sort( int a[], int n) |
36 | { |
37 | int i ,j ,t ,flag ; |
38 | for (i =n -2;i >0; i--) |
39 | { |
40 | flag =0; |
41 | for (j =0;j <i ; j++) |
42 | if (a[j]<a[j +1]) |
43 | { |
44 | t =a[j]; |
45 | a[j]=a[j +1]; |
46 | a[j +1]=t ; |
47 | flag =1; |
48 | } |
49 | if (flag ==0) break ; |
50 | } |
51 | } |
52 | |
53 | /*[改进二]:如果在一次循环中,最后的某些元素没有交换过,则说明后面这些元 |
54 | 素的顺序已排序,下次循环可不对其进行比较?本方法主要考虑要排序的数组元素的范 |
55 | 围,而不是每一轮排序都将数组元素的范围减少1?*/ |
56 | |
57 | sort( int a[], int n) |
58 | { |
59 | int i ,j ,t ,k,flag ; |
60 | flag =n -1; |
61 | while (flag >0) |
62 | { |
63 | k=0; |
64 | for (j =0;j <i ;j ++) |
65 | if (a[j]<a[j +1]) |
66 | { |
67 | t =a[j]; |
68 | a[j]=a[j +1]; |
69 | a[j +1]=t ; |
70 | k=j ; |
71 | } |
72 | flag =k; /*此处不填flag = flag -1;*/ |
73 | } |
74 | } |