<<编程珠玑>>读书笔记 NO. 11章 Qsort1

来源:互联网 发布:西安美林数据是外包吗 编辑:程序博客网 时间:2024/06/05 05:27

 

用了一天时间终于调试成功了

理解算法思路卡了一下,实现时大大的卡了一下,尝试了各种方法,桌上摆道具重复算法过程,用圆珠笔,手机,纸飞机,愤怒小鸟胶皮玩具演习排序过程,

 

后来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];}}


 

原创粉丝点击