03 冒泡排序(Bubble Sort)

每次选择两个元素,按照需求进行交换(比如需要升序排列的话,把较大的元素放在靠后一些的位置),循环 n 次(n 为总元素个数),这样小的元素会不断 “冒泡” 到前面来。

普通版

void bubbleSort(int arr[],int n){//标准版for(int i = 0; i < n - 1; i++){for(int j = 0; j < n - 1 - i; j++){if(arr[j] > arr[j+1]){arr[j] += arr[j+1];arr[j+1] = arr[j] - arr[j+1];arr[j] -= arr[j+1];}}}
}

进阶版

void bubbleSort(int arr[],int n)
{bool swapp = true;while(swapp){swapp = false;for (int  i = 0; i < n - 1; i++) { //这里的n要减1if (arr[i] > arr[i+1] ){arr[i] += a[i+1];arr[i+1] = arr[i] - arr[i+1];arr[i] -=a[i+1];swapp = true;}}}
}

空间效率:O(1)

时间效率:最好情况:O(n)             平均情况:O(N^2)                       最坏情况:O(N^2)

稳定性(相同元素相对位置变化情况):稳定

04 快速排序(Quick Sort)

快排是一个分治的算法,快排算法每次选择一个元素并且将整个数组以那个元素分为两部分,整个快速排序的核心是分区(partition),分区的目的是传入一个数组和选定的一个元素,把所有小于那个元素的其他元素放在左边,大于的放在右边。

根据实现算法的不同,元素的选择一般有如下几种:

1. 永远选择第一个元素

2. 永远选择最后一个元素

3. 随机选择元素

4. 取中间值

int partition(int arr[], int low, int high){int tmp = arr[low];while (low < high) {            while (low < high && arr[high] >= tmp) {high--;}            arr[low] = arr[high];            while (low < high && arr[low] <= tmp) {low++;}            arr[high] = arr[low];}        arr[low] = tmp;return low; }
void quick_sort(int arr[], int low, int high){if(low < high){int pivotpos = partition(arr,low,high);quick_sort(arr,low,pivotpos-1);quick_sort(arr,pivotpos+1,high);}
}

修改统一接口

void quickSort(int arr[],int n){quick_sort(arr,0,n-1);
}
void quick_sort(int arr[],int low,int high){if(low < high){int pivotpos = partition(arr,low,high);quick_sort(arr,low,pivotpos-1);quick_sort(arr,pivotpos+1,high);}
}int partition(int arr[],int low,int high){int tmp = arr[low];while(low < high){while(low < high && arr[high] >= tmp){high--;}arr[low] = arr[high];while(low < high && arr[low] <= tmp){low++;}arr[high] = arr[low];}arr[low] = tmp;return low;
}

算法导论中提供了另一种  partition 的思路

int partition(int arr[], int low, int high){int pivot = arr[high];int i = low - 1;for(int j = low; j <= high - 1; j++){if(arr[j] <= pivot){i++;arr[i] += arr[j];arr[j] = arr[i] - arr[j];arr[i] = arr[i] - arr[j];}} int  temp = arr[i + 1];arr[i + 1] = arr[high];arr[high] = temp;return (i+1);
}

具体代码实现

 int partition(int arr[],int low,int high){int pivot = arr[high];int i = low - 1;for(int j = low; j <= high - 1; j++){if(arr[j] <= pivot){i++;int temp = arr[i];arr[i] = arr[j];arr[j] = temp;//arr[i] += arr[j];  这种交换数值结果出错 //arr[j] = arr[i] - arr[j];//arr[i] -= arr[j];
          }}int temp = arr[i+1];arr[i+1] = arr[high];arr[high] = temp;//arr[i+1] += arr[high];//arr[high] = arr[i+1] - arr[high];//arr[i+1] -= arr[high];return i+1;}

空间效率:最好情况:   O(log2(N+1))    平均情况 : O(log2N)                     最坏情况 : O(log2N)

时间效率:最好情况:O(Nlog2N)                  平均情况:O(Nlog2N)                       最坏情况:O(N2)

稳定性(相同元素相对位置变化情况):稳定

转载于:https://www.cnblogs.com/wanghao-boke/p/10421133.html

九大经典算法之冒泡排序、快速排序相关推荐

  1. 九大排序算法之冒泡排序(原理及实现)

    1.算法原理:比较两个相邻的元素,将值大的元素右移. 2.算法思路:首先第一个元素和第二个元素比较,如果第一个大,则二者交换,否则不交换:然后第二个元素和第三个元素比较,如果第二个大,则二者交换,否则 ...

  2. 九大经典算法之选择排序、堆排序

    05 选择排序 (Selection Sort) 原理:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序 ...

  3. 九大经典算法之基数排序、桶排序

    08 基数排序(Radix Sort) 基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较.排序过程是将所有待比较数值统一为同样的数位长度,数位较短的数前 ...

  4. 九大经典算法之归并排序

    07 归并排序 (Merge Sort) 归并操作的工作原理如下: 第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列: 第二步:设定两个指针,最初位置分别为两个已经排序序列 ...

  5. 九大经典算法之插入排序、希尔排序

    01 插入排序(Insertion Sort) 原理:每次选择一个元素,并且将这个元素和整个数组中的所有元素进行比较,然后插入到合适的位置. void insertion_sort(int arr[] ...

  6. python快速排序算法没看懂_你需要知道的九大排序算法【Python实现】之快速排序...

    五.快速排序 基本思想:  通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,则分别对这两部分继续进行排序,直到整个序列有序. 算法实现: ​ #coding: ...

  7. 「干货」编程语言十大经典算法,你知道几个?

    算法与数据结构是计算机学习路上的内功心法,也是学好编程语言的重要基础.今天给大家介绍一下十大经典算法. 十大经典算法分别是:冒泡排序,插入排序,选择排序,希尔排序,快速排序,归并排序,桶排序,堆排序, ...

  8. 九大排序算法Java实现

    之前学习数据结构与算法时花了三天时间整理九大排序算法,并采用Java语言来实现,今天第一次写博客,刚好可以把这些东西从总结的文档中拿出来与大家分享一下,同时作为自己以后的备忘录. 1.排序算法时间复杂 ...

  9. 十大经典算法总结(JavaScript描述)

    前言 读者自行尝试可以想看源码戳这,博主在github建了个库,欢迎star.读者可以Clone下来本地尝试.此博文配合源码体验更棒哦~~~ 个人博客:Damonare的个人博客 原文地址:十大经典算 ...

最新文章

  1. 重新封装了一下NODE-MONGO 使其成为一个独立的服务.可以直接通过get/post来操作
  2. spring 发送html邮件,Springboot2.0 发送HTML 格式的邮件。
  3. Android(四)——View和ViewGroup
  4. MySQL 创建索引
  5. 理解和使用SQL Server中的并行
  6. iPhone XS Max第三方售价低于7千元 引用户疯抢
  7. 中招了,重写TreeMap的比较器引发的问题...
  8. leetcode题解434-字符串中的单词数(双指针经典)
  9. .net 发送html邮件,c#利用system.net发送html格式邮件
  10. 弹性盒怎么实现左边图片右边文字_【粉丝问题】如何用ps修改照片中的文字数字?...
  11. MFC中MSChart控件安装使用
  12. SMT贴片加工防静电基础知识
  13. python爬取微信运动_如何利用Python爬取微信运动中各个好友的运动信息
  14. 加贺电子发表手掌大小的小型轻量DLP放映机
  15. 只要不上网,pc机就不会感染计算机病毒,计算机考试试题训练
  16. python里面pow是什么意思_pow在python中是什么意思
  17. CVPR 2021大奖出炉!何恺明获最佳论文提名,华人四篇“最佳”!第一届Thomas S. Huang 纪念奖颁发...
  18. 量子计算与量子信息之量子力学引论(一)
  19. MATLAB仿真斜坡信号的校正,控制系统仿真matlab第六章习题答案.doc
  20. 七款文件夹加密软件推荐及使用指南

热门文章

  1. CXF学习(2) helloworld
  2. Python中如何读取xml的数据
  3. 对于shell脚本参数获取时的一点小技巧
  4. SQL 分页存储过程(转)
  5. mysql文件软连接失败,解决打包软链接打包失败问题
  6. saas物资管理界面设计_大型物流企业都在用的SaaS系统,看大规模运配网络如何实现精细化管理?...
  7. python中自定义模块导入飘红_hadoop streaming 中跑python程序,自定义模块的导入
  8. android baseactivity,Android应用开发Android通过BaseActivity获取到当前启动的Activity名称...
  9. win7 mysql php apache myadmin_windows下Apache+mysql+php+phpMyAdmin的安装及配置 | 学步园
  10. python学生分布_Python数据分析实战之分布分析