首先,楼主的代码从头到尾没有对第一个数组元素的操作,仔细分析一下34的位置永远在首位
我跟着程序的思路理了一个程序运行流程给楼主,至于这个问题怎么解决,代码重构了
首先:34,43,6,12,78,37,92,14
第一次排序 i =1, j = 6;交换i,j的位置得到34,92,6,12,78,37,43,14,;i++后i=2,j--后j=5,返回2
第二次排序为前一截(values, 0, 1)就是给34,92排序,这里面不会执行交换,但是因为34<92,i会自加两下,所以最后返回的是i=2;
然后就无限重复第二步、、
这个问题出现的关键在于楼主代码没有对用作标杆的元素换位置,快速排序的核心思路就是在每一轮排序后,标杆元素在中间,左边全比它小,右边全比它大。然后再对左右分别进行排序。
下面是一个比较简洁的快速排序代码,希望能帮到你- /**
- * 交换指定数组a的两个变量的值
- * @param a 数组应用
- * @param i 数组下标
- * @param j 数组下标
- */
- public void swap(int a[], int i, int j) {
-
- if(i == j) return;
-
- int tmp = a[i];
-
- a[i] = a[j];
-
- a[j] = tmp;
-
- }
-
- /**
- *
- * @param array 待排序数组
- * @param low 数组下标下界
- * @param high 数组下标上界
- * @return pivot
- */
- public int partition(int array[], int low, int high) {
- //当前位置为第一个元素所在位置
- int p_pos = low;
- //采用第一个元素为轴
- int pivot = array[p_pos];
-
- for (int i = low + 1; i <= high; i++) {
-
- if (array[i] < pivot) {
-
- p_pos++;
-
- swap(array, p_pos, i);
-
- }
-
- }
-
- swap(array, low, p_pos);
-
- return p_pos;
-
- }
- /**
- * 快速排序实现
- * @param array
- * @param low
- * @param high
- */
- public void quickSort(int array[], int low, int high) {
-
- if (low < high) {
-
- int pivot = partition(array, low, high);
-
- quickSort(array, low, pivot - 1);
-
- quickSort(array, pivot + 1, high);
-
- }
-
- }
复制代码 |