起泡排序与快速排序

此篇为原创,如需转载,请注明出处: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),相对于实用性比较广泛。


 以上是本人对起泡排序和快排算法的理解,欢迎大家指点与修正。后面我会上传关于其他排序的基本操作,大家敬请期待。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值