此篇为原创,如需转载,请注明出处:http://blog.csdn.NET/qq_36759732
起泡法和快排都是以交换元素为方式的排序算法,所以放在一起说。
起泡法:原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,,这样一趟过去后,最大或最小的数字被交换到了最后一位,然后再从头开始进行两两比较交换,直到倒数第二位时结束。起泡法就像一趟之后找到一个一个最大或最小的值,像泡泡一样升上去或者沉到低部,然后总个数减一,再重新排一次,直到全部排完。
发现什么了吗,是不是两个for循环就可以解决,大的for控制总个数,里面的for 找到最值,OK,那我们就这样写吧。
编程环境:Linux
1 #include<stdio.h>
2 #include<time.h>
3
4 #define MAX 10000
5
6 #define swap(a,b){ \
7 __typeof(a) __t = (a); \
8 (a) = (b); (b) = __t; \
9 }
10
11 int cmp(int a, int b){
12 return a > b;
13 }
14
15 void qipao(int arr[], int n){ //起泡算法
16 for(int i = 0; i < n; ++i){
17 for(int j = i + 1; j < n; ++j){
18 if(arr[i] > arr[j]){
19 swap(arr[i],arr[j]);
20 }
21 }
22 }
23 return ;
24 }
25
26 void output(int arr[], int n){ //输出
27 for(int i = 0; i < n; ++i){
28 printf("%d ", arr[i]);
29 }
30 printf("\n");
31 return ;
32 }
33
34 int main(){
35 int n;
36 int arr[MAX];
37 scanf("%d", &n);
38 for(int i = 0; i < n; ++i){
39 scanf("%d", arr + i);
40 }
41 return 0;
42 }
让我们来看看结果
起泡排序还有各种优化,尽量让时间缩短,但是时间效果还是比较高,所以我们就引入一种新的排序—快速排序。
快速排序:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
其实,快排算法就好比种萝卜,找个一个枢纽后,出现一个坑,然后把符合条件的萝卜种到坑里面,递归得到最后的有序数列
编程环境:linux
1 #include<stdio.h>
2 #include<time.h>
3
4 #define MAX 10000
5
6 #define swap(a,b){ \
7 __typeof(a) __t = (a); \
8 (a) = (b); (b) = __t; \
9 }
10
11 int cmp(int a, int b){
12 return a > b;
13 }
14
15 void quick_sort(int arr[], int l, int r){ //快排算法
16 if(r <= l) return ;
17 int x = l;
18 int y = r;
19 int index = l; //选取第一个数为枢纽
20 int z = arr[l];
21 while(x < y){
22 while(x < y && cmp(arr[y], z)) --y; //跳出循环时,找到了符合的y
23 if(x < y) arr[x++] = arr[y];
24 while(x < y && cmp(z, arr[x])) ++x;
25 if(x < y) arr[y--] = arr[x];
26 }
27 arr[x] = z;
28
30 quick_sort(arr, l, x - 1);
31 quick_sort(arr, x + 1, r);
32
33 }
34
35 void output(int arr[], int n){ //输出
36 for(int i = 0; i < n; ++i){
37 printf("%d ", arr[i]);
38 }
39 printf("\n");
40 return ;
41 }
42 int main(){
43 int n;
44 int arr[MAX];
45 scanf("%d", &n);
46 for(int i = 0; i < n; ++i){
47 scanf("%d", arr + i);
48 }
49 quick_sort(arr, 0, n - 1);
50 output(arr, n);
51 return 0;
52 }
我们来看看运行结果吧
快速排序也有优化,以后我会写出来的,在这儿我就不做过多的介绍了。
OK,我们总结一下这两个排序吧,起泡排序找最值元素,进行排序,但时间复杂度太高,快速排序利用递归将元素进行排序,时间复杂度平均为0(nlogn),相对于实用性比较广泛。
以上是本人对起泡排序和快排算法的理解,欢迎大家指点与修正。后面我会上传关于其他排序的基本操作,大家敬请期待。