交换排序算法
来源:互联网 发布:数学模型画图软件 编辑:程序博客网 时间:2024/05/29 15:11
①冒泡排序
描述:交换排序中最简单的排序方法。
生活例子:水中的气泡,体积大的先浮上来
基本思想:前无序,后有序,从头相邻比较,不断挤压向后冒泡。
排序过程:①整个待排序区分为无序区和有序区,初始有序区为空,无序区包括所有。
②从无序区第一个开始,并与相邻关键码比较,大于则交换,小则继续后移。
③重复②操作。
void BubbleSort(int r[], int n){int temp, exchange;exchange = n; //先获取整个待排序序列所有记录while(exchange != 0) {bound = exchange; //获得最后交换位置,因为该位置后的所有都在有序区exchange = 0; //记录交换位置for (int i = 1; i < bound; i++){if (r[i] > r[i+1]){/***进行交换***/temp = r[i];r[i] = r[i+1];r[i+1] = temp;exchange = i; //记录每一次交换的位置}}}}
排序过程:①整个待排序区分为无序区和有序区,初始有序区为空,无序区包括所有。
②从无序区第一个开始,并与相邻关键码比较,大于则交换,小则继续后移。
③重复②操作。
复杂度分析:最好的情况下,在一个循环内为正序,只需执行一次,比较了 n-1次,时间复杂度为O(n)。
最坏的情况下,每一趟都要进行比较和交换,执行 n-1 躺,每趟比较(n-i)次,即递减的 n(n-1)/2,由于交换执行了三次,即移动次数为 3*n(n-1)/2,时间复杂度为:O(n2)。
平均的情况下:时间复杂度为:O(n2)。
②快速排序(分区交换排序)
描述:对起泡排序的改进,记录比较和移动向两端进行,关键码较大的移到后面,反之。
过程:①初始化,选第一个作为轴值,并将i,j分别指向最左右侧位置
②右侧扫描,将轴值记录与j 指向的记录进行比较,如果 j 指向的大,则 j--,重复扫描,直到j(右侧)记录小,将轴值记录与 j位置记录交换,i++③左侧扫面,轴值与i 位置比较,i小则 i++,重复左侧扫描,直到 i大,将轴值与 i 位置记录交换,j--。④重复②③直到i,j相同。
代码如下:
int Partition(int r[ ], int first, int end) { i=first; j=end; //初始化 while (i<j) { while (i<j && r[i]<= r[j]) j--; //右侧扫描 if (i<j) { r[i]←→r[j]; //将较小记录交换到前面 i++; } while (i<j && r[i]<= r[j]) i++; //左侧扫描 if (i<j) { r[j]←→r[i]; //将较大记录交换到后面 j--; }} retutn i; //i为轴值记录的最终位置 }然后是对子序列递归
void QuickSort(int r[], int first, int end) {if(first < end) {pivot = Partition(r, first, end);QuickSort(r, first, pivot - 1);QuickSort(r, pivot + 1, end);}}复杂度分析:最好的情况下,每次划分对一个记录定位后,该记录的左右子侧长度相等,为O(n)
最坏的情况下:待排序记录正序或逆序,O(n2)平均:O(log2n)
0 0
- 排序算法-交换排序
- 交换排序算法实现
- 交换排序算法
- 基础算法-交换排序
- 算法之交换排序
- 交换排序算法
- 交换排序算法
- 交换排序算法
- 排序算法之交换排序
- 排序算法之交换排序
- 常见排序算法:交换排序
- 排序算法之交换排序
- 算法排序系列 -- 交换排序
- 数据结构排序算法-交换排序
- 排序算法之交换排序
- 排序算法之交换排序
- 排序算法(三) - 交换排序
- java算法-排序-交换排序
- KeyEvent event.getRepeatCount
- python学习之路——图形用户界面编程
- Max Consecutive Ones
- 树莓派配置FTP服务器
- Java 使用Map对出现的字符进行计数
- 交换排序算法
- ADV-94-算法提高-复数归一化
- 方立勋_30天掌握JavaWeb_JSTL标签库
- Android 文件下载--普通单线程下载文件
- 先存着-nlp
- 基于JTT809协议的车辆信息交换平台架构方案(下级平台)
- 航运大数据——机遇和挑战
- -----树状数组的理解
- 页面滚动和回到顶部