算法实现之交换排序——冒泡与快排
2016-05-11 21:53
253 查看
冒泡排序
基本思想:
将需要排序的全部元素看成一列,自上而下对相邻两个元素进行比较和调整,让较大的元素往下沉,较小的元素往上冒。也就是如果相邻的两个元素比较后发现与要求的排序顺序相反,则交换他们的位置。元素往上冒的过程类似于水中的气泡,所以叫冒泡排序。
算法实现:
冒泡排序有一种常用的改进方法,就是增加一个标志变量flag,当某一趟冒泡过程没发生一次交换,则说明此时的整个序列已经有序,即可以结束算法。
快速排序
基本思想:
理论上冒泡排序一趟只是确保找到一个元素最终的位置,而快速排序则是在找到一个元素(基准元素)的最终的位置的同时确保基准元素左边的都小于等于它,右边的都大于等于它,从而大大的加速了排序的过程。
步骤:
1、任意选择一个基准元素,通常选第一个或者最后一个
2、将序列分成两部分,左边的都小于等于基准元素,右边的都大于等于基准元素。具体过程如下:
2.1、从后向前找第一个小于基准元素的元素,找到后交换其与基准元素的位置
2.2、从前往后找第一个大于基准元素的元素,找到后交换其与基准元素的位置(2.1交换后的位置)
2.3、执行步骤2.1直到索引发生交叉,说明整个序列已经遍历一趟,此时发生交叉的位置即是基准元素的最终位置。
3、对基准元素的左右两部分分别递归执行步骤1
算法实现:
基本思想:
将需要排序的全部元素看成一列,自上而下对相邻两个元素进行比较和调整,让较大的元素往下沉,较小的元素往上冒。也就是如果相邻的两个元素比较后发现与要求的排序顺序相反,则交换他们的位置。元素往上冒的过程类似于水中的气泡,所以叫冒泡排序。
算法实现:
void bubblesort(int a[], int n) { for (int i = n-1; i > 0; i--) // 第n-i趟确定地i个位置的元素 for (int j = 0; j < i; j++) { if (a[j] > a[j + 1]) swap(a[j], a[j + 1]); } }
冒泡排序有一种常用的改进方法,就是增加一个标志变量flag,当某一趟冒泡过程没发生一次交换,则说明此时的整个序列已经有序,即可以结束算法。
快速排序
基本思想:
理论上冒泡排序一趟只是确保找到一个元素最终的位置,而快速排序则是在找到一个元素(基准元素)的最终的位置的同时确保基准元素左边的都小于等于它,右边的都大于等于它,从而大大的加速了排序的过程。
步骤:
1、任意选择一个基准元素,通常选第一个或者最后一个
2、将序列分成两部分,左边的都小于等于基准元素,右边的都大于等于基准元素。具体过程如下:
2.1、从后向前找第一个小于基准元素的元素,找到后交换其与基准元素的位置
2.2、从前往后找第一个大于基准元素的元素,找到后交换其与基准元素的位置(2.1交换后的位置)
2.3、执行步骤2.1直到索引发生交叉,说明整个序列已经遍历一趟,此时发生交叉的位置即是基准元素的最终位置。
3、对基准元素的左右两部分分别递归执行步骤1
算法实现:
// 快速排序 int partion(int a[], int low, int high) { while (low < high) { //int key = a[low]; while (low < high && a[high] >= a[low]) high--; if (low >= high) break; swap(a[low], a[high]); // 交换后,基准元素在high while (low < high && a[low] <= a[high]) low++; if (low >= high) break; swap(a[low], a[high]); } return low; } void quicksort(int a[], int low, int high) { if (low < high) { int pos = partion(a, low, high); quicksort(a, low, pos - 1); quicksort(a, pos + 1, high); } }
相关文章推荐
- IOS第三方数据库FMDatabase的简单使用
- Git add和空目录杂谈
- nrf51822开发指导之温湿度传感器(DHT11)驱动程序
- MAC(Linux)升级Openssl
- C#三十二 泛型的理解和使用
- C#三十二 泛型的理解和使用
- 反射、注解与依赖注入总结
- NEU 1694 Primorial vs LCM 【数学】
- C#三十二 泛型的理解和使用
- “洗牌”算法
- 学习大数据第七天:mysql5.7 rar版本的下载与安装(亲测有效)
- 集合复习
- 算法导论第十八章 B树
- Porter Algorithm ---------词干提取算法
- linux shell ; || &&的区别
- 比较两个字符串,找出最大的相同子串
- 第五届山东省ACM angry_birds_again_and_again(积分)
- 关于操作java中的SD卡文件的一些总结
- [转]c++中的类型及运算
- 安卓listview实现购物车