java实现几种排序算法, 排序原来也挺有意思啊

来源:互联网 发布:杭州淘宝g20怎么办 编辑:程序博客网 时间:2024/06/13 02:14

嗯 排序应该是没有最优的
只有在一定条件下最优

这两天看了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); } 


今天到这里 
下次放出选择排序的分析

原创粉丝点击