用了一天时间终于调试成功了
理解算法思路卡了一下,实现时大大的卡了一下,尝试了各种方法,桌上摆道具重复算法过程,用圆珠笔,手机,纸飞机,愤怒小鸟胶皮玩具演习排序过程,
后来Debug跟踪发现 watch 变量中 ++m会导致诡异的效果
后来跟踪入swap函数终于发现,没有考虑到 待交换的两个元素 同一索引,即同一个元素,这是不能用^交换,会导致清0效果!!!!!!
思路不写了,饿了吃饭去了,自我记录一下,不要用我的这篇当学习文档
这里有一个GIF动画展示过程
http://en.wikipedia.org/wiki/Quicksort#Simple_version
package org.algorithm;
/**
* Qsort
* @author Administrator
*
*/
public class Qsort1 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {58,43,29,69,2,123,32,1,-2,432,31,44};
Qsort1 myqsort = new Qsort1();
myqsort.qsort1(arr,0,arr.length-1);
// swapByIndex(arr, 1,0 );
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]);
System.out.print(",");
}
}
public void qsort1(int[] _arr,int startIdx,int endIdx){
System.out.println("qsort ==== "+_arr);
//结束条件
if(startIdx>=endIdx){
return;
}
int mid = startIdx;//中心索引 随判断动态移动
//第一个元素作为比对的元素 ,目标是以他为中心左右分布
/**
* 核心思想:
* 以第一个元素为参照左右分割
* 第一个元素a1位置不变,第二个元素a2(<=a1)担当巡视职责去分割左右
* 最后再交换a1 a2
* 左右两部分分别递归
*/
int tmp = 0;
for(int i=startIdx+1;i<=endIdx;i++){
if(_arr[i]<_arr[startIdx]){
mid++;
swapByIndex(_arr,i,mid);
// tmp = _arr[i];
mid++;
// _arr[i]= _arr[++mid];
// _arr[mid] = tmp;
}
}//end for
//交换a1,a2
swapByIndex(_arr,startIdx,mid);
// tmp = _arr[mid];
// _arr[mid] = _arr[startIdx];
// _arr[startIdx] = tmp;
//左右两个部分递归
qsort1(_arr,startIdx, mid-1);
qsort1(_arr,mid+1,endIdx);
}
/**
* swap value
* elegant haha
* @param a
* @param b
*/
private void swapByIndex(int[] _arr,int indexA,int indexB){
/**
* 一定要判断,否则 会把元素清0
*/
if(indexA==indexB){
return;
}
_arr[indexA]^=_arr[indexB];
_arr[indexB]^=_arr[indexA];
_arr[indexA]^=_arr[indexB];
}
}