快速排序

有如下一组数:
6 5 4 2 7 3 1 8
要求用快速排序,而且,
1。要把7做为中央值,分割成两个组
2。再将由1分得的元素数较多的组再分割成两个组。
3。再将由2分得的元素数较多的组再分割成两个组。
请问该怎么分,不要求程序,只要给出每次分组的情况说明就可以。
谢谢。

基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。一趟快速排序的算法是:
1)设置两个变量I、J,排序开始的时候:I=0,J=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即 key=A[0];
3)从J开始向前搜索,即由后开始向前搜索(J=J-1),找到第一个小于key的值A[J],并与A[I]交换;
4)从I开始向后搜索,即由前开始向后搜索(I=I+1),找到第一个大于key的A[I],与A[J]交换;
5)重复第3、4、5步,直到 I=J; (3,4步是在程序中没找到时候j=j-1,i=i+1,直至找到为止。找到并交换的时候i, j指针位置不变。另外当i=j这过程一定正好是i+或j+完成的最后另循环结束) 6 5 4 2 7 3 1 8
以7为key进行排序:
第一次交换:6 5 4 2 3 7 1 8
第二次交换:6 5 4 2 3 1 7 8
至此完成第一趟排序得到{6 5 4 2 3 1} 7 {8}两个部分再按以上思想进行排序;
对于前一部分假设以4为key进行排序后半部分只有一个数就不要排了:
第一次交换:4 5 6 2 3 1
第二次交换:2 5 6 4 3 1
第三次交换:2 5 6 3 4 1
第四次交换:2 5 6 3 1 4
第五次交换:2 4 6 3 1 5
第六次交换:2 3 6 4 1 5
第七次交换:2 3 4 6 1 5
第八次交换:2 3 1 6 4 5
第九次交换:2 3 1 4 6 5
至此完成第二趟排序得到{2 3 1} 4 {6 5}两个部分再按以上思想进行排序;
前半部分得到{1 2 3},后半部分得到{5 6};
至此排序结束。
希望对LZ有帮助。

参考资料:http://baike.baidu.com/view/115472.htm

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-02-11
public class QuickSort { public static void sort(Comparable[] data, int low, int high) { // 枢纽元,一般以第一个元素为基准进行划分 int i = low; int j = high; if (low < high) { // 从数组两端交替地向中间扫描 Comparable pivotKey = data[low]; // 进行扫描的指针i,j;i从左边开始,j从右边开始 while (i < j) { while (i < j && data[j].compareTo(pivotKey) > 0) { j--; }// end while if (i < j) { // 比枢纽元素小的移动到左边 data[i] = data[j]; i++; }// end if while (i < j && data[i].compareTo(pivotKey) < 0) { i++; }// end while if (i < j) { // 比枢纽元素大的移动到右边 data[j] = data[i]; j--; }// end if }// end while // 枢纽元素移动到正确位置 data[i] = pivotKey; // 前半个子表递归排序 sort(data, low, i - 1); // 后半个子表递归排序 sort(data, i + 1, high); }// end if }// end sort public static void main(String[] args) { // 在JDK1.5版本以上,基本数据类型可以自动装箱 // int,double等基本类型的包装类已实现了Comparable接口 Comparable[] c = { 6,5,4,2,7,3,1,8}; sort(c, 0, c.length - 1); for (Comparable data : c) { System.out.println(data); } } }
第2个回答  2011-02-11
你排序的过程中,在if (dest[--j] == null)这一句出现异常,因为没有检查j的取值,比如这时j=0,然后先--j那么就变成负的了,这时当然超出范围了。
建议改成if (j > 0 && dest[--j] == null),同样 if (dest[++i] == null)也存在隐患,可以改成 if (i<right && dest[++i] == null)
综述,并不是你设置数组范围大小引起的问题,而是在数组大了后,进行一系统交换或运算出现那种情况,因此才暴露出了问题。