排序算法 Java编程问题 小结
快排
遇到的问题:
通过断点调试 发现主要的问题是在第二递归时的if判断语句条件不对,看了 这篇博客的条件判断才发现问题所在。第一个判断语句不应该是l>1,而是左指针大于左边界lchild.完整的快排Java代码如下:
package Sort; import java.util.Arrays; public class QuickSort { public static void main(String args[]) { int arr[]= {33,2,3,4,6,1,34,21,45,25,76,81,18}; sort(arr,0,arr.length-1); System.out.println(Arrays.toString(arr)); } public static void sort(int arr[],int lchild,int rchild) {//为什么这里非要static修饰呢? /*第一步 建立枢纽 * 第二步 设置方向 * 第三步 l r 分别为左右指针 lchild rchild分别表示左右边界 * */ int l = lchild; int r = rchild; int temp = arr[l];//待调整的元素,每一次将左边界值作为枢纽 int direction = 0;//表从右开始; while( r != l ) { if(direction == 0) { if(r>lchild && arr[r]<temp ) { arr[l]=arr[r]; direction = 1; }else r--; }else { if(l<rchild && arr[l]>temp) { arr[r] = arr[l]; direction = 0; }else l++; } } arr[l] = temp;//每一步的操作都是交换位置,这一步有必要吗?有,因为每次交换位置之后都是都是值大的替代了前一位,所以在数组在单轮调整完全之前都会有两个值相同。故待调整的元素会被覆盖,将提前存好的待调元素放在左右指针相汇的位置。 if(l>lchild) {//注意这里不是l>1 ,而是左指针大于左边界 sort(arr,lchild,l-1); } if( rchild-r >1) { sort(arr,r+1,rchild); } } }