您的位置:首页 > 编程语言 > Java开发

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

2012-08-21 09:05 323 查看
嗯 排序应该是没有最优的

只有在一定条件下最优

这两天看了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 算法
相关文章推荐