java实现几种排序算法, 排序原来也挺有意思啊
2012-08-21 09:05
323 查看
嗯 排序应该是没有最优的
只有在一定条件下最优
这两天看了cnBeta上的一个新闻(http://www.cnbeta.com/articles/202221.htm)
突然觉得有好多排序自己都不太记得了
那就写一下试试呗~~
一种是从高到低 每次遍历出一个当前最低的出来,放到数组尾部
一种是从低到高 每次遍历出一个当前最高值出来 放到数组的尾部
我觉得这种排序最傻
我就只实现一种 从低到高好了
这个超简单
不多解释了
2 快速排序
-----------------------------------------------------------------------------------------------------------------------
我表示我想了一下逻辑
这个用java展现不知道是不是java本身的问题
感觉特别难展现
最后只好从网上查算法
我就只做一下分析吧
先说一下快速排序的特点
快速排序是这样的
先拿出第一个数字做为一个参照数字
我们叫他X
数组应该是这样的:
X (后面全部的数)
然后让X从后往前做比较
如果从小到大
那就看谁比X小 反之亦然
如果有比X小的 就和X交换位置
交换完之后是这样的结果
(左侧还是乱序) x (右侧肯定都比X大)
然后我们按照从前到后的顺序对比左侧 把左侧比X大的数 移到右侧
快速排序有点麻烦 我这里把一次对比的结果放出来 顺便加上注释解释一下:
2,0,1,5,4,3,8,6,9,7, (lo,hi) = (0,8) //第一次比较 是X和7做对比 显然7大于X,不用移动位置
2,0,1,5,4,3,8,6,9,7, (lo,hi) = (0,7) //第二次比较 9也大于X 下面同理
2,0,1,5,4,3,8,6,9,7, (lo,hi) = (0,6)
2,0,1,5,4,3,8,6,9,7, (lo,hi) = (0,5)
2,0,1,5,4,3,8,6,9,7, (lo,hi) = (0,4)
2,0,1,5,4,3,8,6,9,7, (lo,hi) = (0,3)
2,0,1,5,4,3,8,6,9,7, (lo,hi) = (0,2)
1,0,2,5,4,3,8,6,9,7, (lo,hi) = (1,2) //第八次 2和1对比后换了位置 这时候数组的结构是 (1,0) 2 (5,4,3,8,6,9,7)
, 右侧比参照数字大,左侧小
1,0,2,5,4,3,8,6,9,7, (lo,hi) = (2,2) //第九次 2和0对比 确认左侧都比2小
0,1,2,5,4,3,8,6,9,7, (lo,hi) = (1,1) //第十次 1和0对比 并交换位置 这时候 左侧已经排序完成了
0,1,2,5,4,3,8,6,9,7, (lo,hi) = (3,8) //第十一次 现在数组从5开始 数组分成两截[0,1,2] (5,4,3,8,6,9,7)
左侧方括号里是排好的
0,1,2,5,4,3,8,6,9,7, (lo,hi) = (3,7) //同上 5和9 做对比
0,1,2,5,4,3,8,6,9,7, (lo,hi) = (3,6)
0,1,2,5,4,3,8,6,9,7, (lo,hi) = (3,5)
0,1,2,3,4,5,8,6,9,7, (lo,hi) = (4,5) //5和3对比后 交换位置
0,1,2,3,4,5,8,6,9,7, (lo,hi) = (5,5) //5和4对比 保持正确的顺序
0,1,2,3,4,5,8,6,9,7, (lo,hi) = (3,3) //对照数换成了8 8和7比较,然后交换位置
0,1,2,3,4,5,7,6,9,8, (lo,hi) = (7,9) //切换成正序, 数组变为[0,1,2,3,4,5,] (7, 6,9,)
8 ,把数组(7.6.9) 中 比8大的 移动到右侧
0,1,2,3,4,5,7,6,9,8, (lo,hi) = (8,9) //8和6对比 不改变位置
0,1,2,3,4,5,7,6,8,9, (lo,hi) = (8,8) //8和9对比 交换位置 这时候数组变成: [0,1,2,3,4,5] (7,6) 8 (9) 在对左侧数组作对比
0,1,2,3,4,5,6,7,8,9, (lo,hi) = (7,7) //6和7 对比 交换位置
这里其实并没有完, 右侧数组就剩一个数 程序判断一下 lo==hi
所以递归返回
最后打印结果
代码也放出来:
今天到这里
下次放出选择排序的分析
只有在一定条件下最优
这两天看了cnBeta上的一个新闻(http://www.cnbeta.com/articles/202221.htm)
突然觉得有好多排序自己都不太记得了
那就写一下试试呗~~
1 冒泡排序
-----------------------------------------------------------------------------------------------------------------------
这种分两种顺序一种是从高到低 每次遍历出一个当前最低的出来,放到数组尾部
一种是从低到高 每次遍历出一个当前最高值出来 放到数组的尾部
我觉得这种排序最傻
我就只实现一种 从低到高好了
/** * 冒泡排序 * @param arr * @return */ public static int[] bubbleSort(int[] arr){ for(int i=0; i<arr.length; i++){ for(int j=0; j<arr.length; j++){ if(arr[i]<arr[j]) { int sum = arr[i]; arr[i] = arr[j]; arr[j] = sum; } } } System.out.println("haha"); return arr; }
这个超简单
不多解释了
2 快速排序
-----------------------------------------------------------------------------------------------------------------------
我表示我想了一下逻辑
这个用java展现不知道是不是java本身的问题
感觉特别难展现
最后只好从网上查算法
我就只做一下分析吧
先说一下快速排序的特点
快速排序是这样的
先拿出第一个数字做为一个参照数字
我们叫他X
数组应该是这样的:
X (后面全部的数)
然后让X从后往前做比较
如果从小到大
那就看谁比X小 反之亦然
如果有比X小的 就和X交换位置
交换完之后是这样的结果
(左侧还是乱序) x (右侧肯定都比X大)
然后我们按照从前到后的顺序对比左侧 把左侧比X大的数 移到右侧
快速排序有点麻烦 我这里把一次对比的结果放出来 顺便加上注释解释一下:
2,0,1,5,4,3,8,6,9,7, (lo,hi) = (0,8) //第一次比较 是X和7做对比 显然7大于X,不用移动位置
2,0,1,5,4,3,8,6,9,7, (lo,hi) = (0,7) //第二次比较 9也大于X 下面同理
2,0,1,5,4,3,8,6,9,7, (lo,hi) = (0,6)
2,0,1,5,4,3,8,6,9,7, (lo,hi) = (0,5)
2,0,1,5,4,3,8,6,9,7, (lo,hi) = (0,4)
2,0,1,5,4,3,8,6,9,7, (lo,hi) = (0,3)
2,0,1,5,4,3,8,6,9,7, (lo,hi) = (0,2)
1,0,2,5,4,3,8,6,9,7, (lo,hi) = (1,2) //第八次 2和1对比后换了位置 这时候数组的结构是 (1,0) 2 (5,4,3,8,6,9,7)
, 右侧比参照数字大,左侧小
1,0,2,5,4,3,8,6,9,7, (lo,hi) = (2,2) //第九次 2和0对比 确认左侧都比2小
0,1,2,5,4,3,8,6,9,7, (lo,hi) = (1,1) //第十次 1和0对比 并交换位置 这时候 左侧已经排序完成了
0,1,2,5,4,3,8,6,9,7, (lo,hi) = (3,8) //第十一次 现在数组从5开始 数组分成两截[0,1,2] (5,4,3,8,6,9,7)
左侧方括号里是排好的
0,1,2,5,4,3,8,6,9,7, (lo,hi) = (3,7) //同上 5和9 做对比
0,1,2,5,4,3,8,6,9,7, (lo,hi) = (3,6)
0,1,2,5,4,3,8,6,9,7, (lo,hi) = (3,5)
0,1,2,3,4,5,8,6,9,7, (lo,hi) = (4,5) //5和3对比后 交换位置
0,1,2,3,4,5,8,6,9,7, (lo,hi) = (5,5) //5和4对比 保持正确的顺序
0,1,2,3,4,5,8,6,9,7, (lo,hi) = (3,3) //对照数换成了8 8和7比较,然后交换位置
0,1,2,3,4,5,7,6,9,8, (lo,hi) = (7,9) //切换成正序, 数组变为[0,1,2,3,4,5,] (7, 6,9,)
8 ,把数组(7.6.9) 中 比8大的 移动到右侧
0,1,2,3,4,5,7,6,9,8, (lo,hi) = (8,9) //8和6对比 不改变位置
0,1,2,3,4,5,7,6,8,9, (lo,hi) = (8,8) //8和9对比 交换位置 这时候数组变成: [0,1,2,3,4,5] (7,6) 8 (9) 在对左侧数组作对比
0,1,2,3,4,5,6,7,8,9, (lo,hi) = (7,7) //6和7 对比 交换位置
这里其实并没有完, 右侧数组就剩一个数 程序判断一下 lo==hi
所以递归返回
最后打印结果
代码也放出来:
/** * 快速排序 * @param arr * @return */ /**快速排序方法*/ public static void quickSort(int[] a, int lo0, int hi0) { int lo = lo0; int hi = hi0; if (lo >= hi) return; //确定指针方向的逻辑变量 boolean transfer=true; while (lo != hi) { if (a[lo] > a[hi]) { //交换数字 int temp = a[lo]; a[lo] = a[hi]; a[hi] = temp; //决定下标移动,还是上标移动 transfer = (transfer == true) ? false : true; } //将指针向前或者向后移动 if(transfer) hi--; else lo++; //显示每一次指针移动的数组数字的变化 for(int i = 0; i < a.length; ++i) { System.out.print(a[i] + ","); } System.out.print(" (lo,hi) = " + "(" + lo + "," + hi + ")"); System.out.println(""); /**/ } //将数组分开两半,确定每个数字的正确位置 lo--; hi++; quickSort(a, lo0, lo); quickSort(a, hi, hi0); }
今天到这里
下次放出选择排序的分析
相关文章推荐
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 元素排序几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 【排序算法】直接插入排序(java实现)
- 用Java实现几种常见的排序算法
- 【转】排序算法复习(Java实现)(一): 插入,冒泡,选择,Shell,快速排序
- 排序算法---(3)简单插入排序---Java实现
- 用Java实现几种常见的排序算法
- 几种常见排序算法的Java代码实现
- java 排序算法实现 其四:快速排序
- 用Java实现几种常见的排序算法
- 用Java实现几种常见的排序算法
- 排序算法复习(Java实现)(二): 插入,冒泡,选择,Shell,快速排序
- java几种排序算法的实现及简单分析
- 几种常见排序算法的java实现
- 【转】排序算法复习(Java实现) (二): 归并排序,堆排序,桶式排序,基数排序
- Java实现几种常见排序方法
- java实现各种排序算法(包括冒泡排序,选择排序,插入排序,快速排序(简洁版))及性能测试
- 排序算法总结(一)---- 直接插入排序,希尔排序(java实现)
- Java实现几种常见排序方法