交换排序 - 冒泡排序 - 快速排序

8 篇文章 0 订阅

冒泡排序

   通过相邻元素的比较和交换,将排序码较小的元素逐渐从底部移向顶部。由于整个排序的过程就先水底下面的气泡一样逐渐向上冒,所以称为冒泡排序

void bubbleSort(int a[],int len){
    int temp=0;
    for(int i =0; i < len;i++){
        for(int j = len-1;j>i;j--){

            if(a[j]<a[j-1]){
                temp = a[j];
                a[j] = a[j-1];
                a[j-1] = temp;              
            }
        }
    }
}

基本快速排序。。。不稳定  最理想 O(nlogn) 最差时间O(n^2)

    * 选取参照值,把数列中小于改值的放左边,大于的放右边--递归

    * 整个过程相当于把左右边的值放在合适的位置,中间的位置,即他的排好序的数列的位置

    * 快速排序是对冒泡跑排序 的升级改进(书上说的),我更认为的是对选择排序的优化-因为其不稳定的原因正是和选择排序类似-其优化原理类似于希尔排序对插入排序的优化

    * 因为冒泡排序是稳定的排序,而快排不稳定,本人完全不明白两者有什么关联---如有知道的还请告知

    * 直接插入+shell | 直接选择+堆 | 冒泡+快速排序    

    * 快速排序的时间,受到参照值的影响,本程序采用最右端的值为参照,并不是最优的取值,根据我的了解,去中间的值会比较好一些

 *
    * 注意,快速排序没有最后整体排序,但一开始先排了一次。
    */
void quickSort(int arr[],int left,int right){
       if(right - left<=0){
            return;
        }else{
            //划分数组
            int leftPosition = partition(arr, left, right, arr[right]);
            //排序左边的子数组
            quickSort(arr,left,leftPosition -1);
            //排序右边的子数组======leftPosition这个位置不变因为它是划分点值,
            //整个过程相当于选出划分点的位置 及数组最右端值的排序位置,不管两边的值如何换它的位置不变
            quickSort(arr,leftPosition+1,right);
        }
   }
//分组操作--找出中间位置--选择最右边的值为参照值
int partition(int a[],int left,int right,int point){
       //point表示数组参照对象,即子数组最右端的索引的值,也可省略此参数,用a[right]代替
       int leftPos = left -1;
       int rightPos = right;
       
       while(true){//划分数列
         //以次选出左边比划分点大的值的索引
           while(leftPos < rightPos&&a[++leftPos]<point);
         //以次选出右边比划分点小的值的索引
           while(rightPos>leftPos&&a[--rightPos]>point);
         //如果左右碰面则结束交换,且结束划分
           if(leftPos >= rightPos){
               break;
           }else{
               int temp;
               temp = a[rightPos];
               a[rightPos] = a[leftPos];
               a[leftPos] = temp;
           }
       }
       //交换数列最右端的值到合适位置,即leftPos位置
      //交换最右端的值和当前碰面点的值,完成最后划分补位
       int temp;
       temp = a[leftPos];
       a[leftPos] = a[right];
       a[right] = temp;
       
       return leftPos;
   }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨中漫步t2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值