黑马程序员技术交流社区
标题:
想问一个关于排序的问题,新手。
[打印本页]
作者:
何创
时间:
2012-10-29 11:01
标题:
想问一个关于排序的问题,新手。
JAVA中 快速排序,最好可以代码举例说明下,新手,不懂快速排序,最近看的排序,挺晕。
作者:
丁桂松
时间:
2012-10-29 11:05
本帖最后由 丁桂松 于 2012-10-29 11:15 编辑
占搂,等代码!
作者:
丁桂松
时间:
2012-10-29 11:05
本帖最后由 丁桂松 于 2012-10-29 11:08 编辑
快速排序法的基本精神是在数列中找出适当的轴心,然后将数列一分为二,分别对左边与右边
数列进行排序,而影响快速排序法效率的正是轴心的选择。
解法这边所介绍的快速演算如下:将最左边的数设定为轴,并记录其值为 s
廻圈处理:
令索引 i 从数列左方往右方找,直到找到大于 s 的数
令索引 j 从数列左右方往左方找,直到找到小于 s 的数
如果 i >= j,则离开回圈
如果 i < j,则交换索引i与j两处的值
将左侧的轴与 j 进行交换
对轴左边进行递回
对轴右边进行递回
透过以下演算法,则轴左边的值都会小于s,轴右边的值都会大于s,如此再对轴左右两边进行
递回,就可以对完成排序的目的,例如下面的实例,*表示要交换的数,[]表示轴:
[41] 24 76* 11 45 64 21 69 19 36*
[41] 24 36 11 45* 64 21 69 19* 76
[41] 24 36 11 19 64* 21* 69 45 76
[41] 24 36 11 19 21 64 69 45 76
21 24 36 11 19 [41] 64 69 45 76
在上面的例子中,41左边的值都比它小,而右边的值都比它大,如此左右再进行递回至排序完
成。
作者:
周万谋
时间:
2012-10-29 11:12
最快的排序是希尔排序,但是一般不常用,把常用的:选择排序、冒泡排序弄明白就差不多了。
作者:
罗力
时间:
2012-10-29 14:14
这是冒泡排序,你可以参考下
public class Test1 {
/*
* 已知一个int类型的数组,用冒泡排序法将数组中的元素进行排列。
* */
public static void main(String[] args) {
int[] a = {4,5,7,0,-2,9,1,1};
bubbleSort(a);
for(int i=0;i<a.length-1;i++){
System.out.print(a[i]);
}
}
//循环里面的每一元素,让他们互相比较
private static void bubbleSort(int[] source) {
for(int i=source.length-1; i>0; i--){
for(int j=0; j<i; j++){
if(source[j]>source[j+1]){
swap(source, j, j+1);
}
}
}
}
//对于满足source[j]>source[j+i]条件的互相交换位置
private static void swap(int[] source, int x, int y) {
int temp ;
temp = source[x];
source[x] = source[y];
source[y] = temp;
}
}
作者:
何创
时间:
2012-10-29 21:58
丁桂松 发表于 2012-10-29 11:05
快速排序法的基本精神是在数列中找出适当的轴心,然后将数列一分为二,分别对左边与右边
数列进行排序,而 ...
你说的,我貌似没搞懂。。更晕了。
作者:
xuchulong1
时间:
2012-10-29 22:34
其实对于快排,二楼说得差不多了
块排的话就是快速的排序,速度很快(当然指的是平均速度),而冒泡,选择等,则相对慢很多。
说下块排的最简单实现方法:
1:从一个数组中取出第一个数字(理论上随便取,为了便于理解),放到一个新的数组里。
2:从第二个数字开始依次取出,和这个数字做比较,比它小得,放在它左边,比他大的放在它右边(这样它左边的数都是比它小的数字,而它右边的数则都是比它大的数字);
3:把左边(和右边)这半部分各取出第一个数,再放到一个数组中,拿左边所有数字和它比较,大的放左边,小的放右边
4:一直这么取下去...直到最后只有两个数字的时候,比一下,则全部有序了
譬如数组 a 中是 : 8 4 9 6 3 5 12
取出 8 : 8 把 4 9 6 3 5 12 着几个数字和它依次比较 得到结果 : 4 6 3 5
8
9 12(可以看到,前面全部是比8 小的,后面全部是比8 大的)
4 6 3 5 和 9 12 取出第一个数字,进行排序: 则前半部分结果为: 3
4
6 5 后面两个 为 9 12 (这样后半部分排序就完成了) 现在的数组情况是
3 4 6 5 8 9 12
再看 4 前面是 3 只有一个数字,那也肯定是已经有序了(因为我们已经拿3和4 比较过了,因为比它小才放它前面的)。 4后面是6 5,那取出 6 ,把5 和6 进行比较, 6>5 当然 所有需要比较的都已经比较完了,最后正确的结果也已经出来了。 结果是:3 4 5 6 8 9 12
作者:
xuchulong1
时间:
2012-10-29 22:43
看完思路(思路需要自己慢慢看,一步一步理解了往下看,不要着急,不然搞得头昏的 ps 下面的序号忘了标了),
我说下写法:首先这样的实现方式肯定是用递归无疑了,递归函数的参数应该有这个数组,数组的第一个元素下表和数组最后一个元素下标
递归的出口是 第一个元素下标等于或者大于最后一个元素的下标(自己好好想一下,如果递归不会用的话好好看一看递归怎么用)
希望你已经能理解了,另外,我真的很渴望技术分呀,哈哈哈
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2