已经好久没写算法了,脑袋都生锈了。。
首先排序分为四种:
交换排序: 包括冒泡排序,快速排序。
选择排序: 包括直接选择排序,堆排序。
插入排序: 包括直接插入排序,希尔排序。
合并排序: 合并排序。
本篇对交换排序进行研究。
1、冒泡排序
- 比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。
- 这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。
- N=N-1,如果N不为0就重复前面二步,否则排序完成。
精髓:相邻之间相比较交换
public static void bubbleSort(int arr[]){ for(int i=0;i<arr.length;i++){//1.外层循环 for(int j=0;j<arr.length-1-i;j++){//2.内层循环 if(arr[j]>arr[j+1]){//3.逐个比较,大于则交换 int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } }
2、快速排序
快速排序采用的思想是分治思想。
快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正 确位置,排序完成。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。
- 记录排序数组左边坐标,当前排序数组右边坐标,取左边的一个数据当作基点(把这个点挖出一个坑)
- 从右边往左边找,找到一个比base小的数据,把从右边找到的小于base的数据填到左边挖出的坑
- 从左往右边找,找到一个比base大的数据,把从左边找到的大于base的数据填到右边挖出的坑
- 把base填到最后剩下的坑
- 对依赖base排好序数组的左边的数组排序
- 对依赖base排好序数组的右边的数组排序
太抽象了。。。
还是举例子来说明吧
(1)、left=0,right=5,base=50;//首先记录左边的坐标,右边的坐标,取第一个数据做为基准。可以理解数组[0]已经被挖坑了。
0
|
1
|
2
|
3
|
4
|
5
|
50
|
20
|
10 |
70
|
30
|
60
|
(2)、从右往左找,找到一个比基准50小的数据,数据是30,此时数组[0]=30,被填坑,数组[4]被挖坑。right坐标移到4,left还是为0。
0
|
1
|
2
|
3
|
4
|
5
|
30
|
20
|
10 |
70
|
30
|
60
|
0
|
1
|
2
|
3
|
4
|
5
|
30
|
20
|
10 |
70
|
70
|
60
|
0
|
1
|
2
|
3
|
4
|
5
|
30
|
20
|
10 |
50
|
70
|
60
|
代码如下:
public static void quickSort(int array[],int sortArrayLeft,int sortArrayRight){ if(sortArrayLeft>=sortArrayRight){ return; } int left = sortArrayLeft; //1.1、当前排序数组左边坐标 int right = sortArrayRight; //1.2、当前排序数组右边坐标 int base = array[left]; //1.3、取左边的一个数据当作基点 while(left<right){ while(left<right && array[right]>=base){//2、从右边往左边找,找到一个比base小的数据 right --; } array[left] = array[right];//3、把从右边找到的小于base的数据填到左边挖出的坑 while(left <right && array[left] <= base){//4、从左往右边找,找到一个比base大的数据 left ++; } array[right] = array[left];//5、把从左边找到的大于base的数据填到右边挖出的坑 } array[left] = base;//6、把base填到最后剩下的坑 quickSort(array, sortArrayLeft, left-1);//7、对依赖base排好序数组的左边的数组排序 quickSort(array, left+1, sortArrayRight);//8、对依赖base排好序数组的右边的数组排序 }
相关推荐
VC++多线程实现三种排序算法比较----冒泡排序、快速排序、归并排序,很有意思,可以下载看看!
选择排序 冒泡排序 插入排序 合并排序 快速排序算法原理及代码实现 不同排序算法时间效率的经验分析方法 验证理论分析与经验分析的一致性 当面临巨大数据量的排序的时候,还是优先选择合并排序算法和快速排序算法。...
各类排序算法整理--C语言描述--本人编写 排序算法种类有: 冒泡 快速排序 堆排序 希尔排序 插入排序 选择排序 二路归并排序
关于c#的一些算法 选择排序 冒泡排序 快速排序 插入排序 希尔排序 归并排序 基数排序 计数排序。。。
经典排序算法 - 快速排序Quick sort 经典排序算法 - 桶排序Bucket sort 经典排序算法 - 插入排序Insertion sort 经典排序算法 - 基数排序Radix sort 经典排序算法 - 鸽巢排序Pigeonhole sort 经典排序算法 - ...
Java代码-排序-直接插入排序、希尔排序、直接选择排序、冒泡排序、堆排序、快速排序、归并排序中部分排序以及算法-贪心法,大家可以将源码下载下来进行学习,附带着注释和解释,有不理解的可以找博主一起探讨,共同...
一个简单的算法效率对比,实验证明,快速排序的效率比冒泡的效率高出很多啊!
此文件为数据结构中的九种排序算法,包含一些排序方法的过程,其九种排序包括:直接插入排序,折半插入排序,希尔排序,冒泡排序,快速排序,选择排序,堆排序,归并排序,基数排序!
数据结构(c语言版)严蔚敏 吴伟民编著 中直接插入排序、折半排序、shell排序、冒泡排序、快速排序、选择排序、堆排序的实现、归并排序,使用c语言实现
7大排序算法(快速排序,冒泡排序,选择排序,归并排序,插入排序,希尔排序,堆排序)实现源码
本文件是7种常用排序算法的实现(C++),包括冒泡排序、选择排序、直接插入排序、希尔排序、堆排序、归并排序以及快速排序。代码详细有注释且有测试用例。
经典排序算法,有选择排序,冒泡排序,交换排序,谢尔排序,插入排序基数排序
各种常用c++排序算法,包括插入排序、冒泡排序、选择排序、快速排序、归并排序、希尔排序等
内容简介: 涵盖 - 插入排序 & - 冒泡排序 & - 选择排序 & - 希尔排序 & - 归并排序 & - 快速排序 & - 计数排序 & - 堆排序 模板与解析。 适合人群: 普及早期的萌新 OIer 们。
(1) 冒泡排序和快速排序; (2) 插入排序和希尔排序; (3) 选择排序和堆排序; (4) 递归和非递归的归并排序。 2. 产生不同规模和分布的数据,以 Excel 生成算法执行时间 T(n)关于输入规模 n 的曲线的形式,...
希尔排序,冒泡排序、快速排序递归排序,快速排序非递归排序,快速排序改进算法
六种内部排序算法比较:直接插入排序、希尔排序、冒泡排序、快速排序、选择排序、堆排序。包含实验报告和源代码设计。
JAVA冒泡排序和快速排序算法,符合实验报告要求哦
设计排序典型算法(冒泡与快速排序).doc
算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...