玩博客园很多年,第一次写点什么,就从基础开始吧。最近去面试,发现自己算法忘光了,赶紧复习下。以下代码自带测试类,复制进eclipse中右键 run as --》java application 即可。控制台清晰打印出快排的过程。
1 package test; 2 3 4 /** 5 * 6 * 排序算法测试类 7 * 8 */ 9 public class TestForSort { 10 11 /** 12 * @param args 13 */ 14 public static void main(String[] args) { 15 int[] array = new int[] {4,1,5,3,2,6}; 16 //快排 17 quicksort(array,0,array.length-1); 18 System.out.println("=======最终========="); 19 for(int a:array){ 20 System.out.print(a); 21 } 22 } 23 24 /** 25 * 快速排序 26 * 27 * @param int n[] 要排序的数组 28 * @param left 排序开始下标 29 * @param right 排序结束下标 30 * @return 31 */ 32 static void quicksort(int n[], int left, int right) { 33 int dp; 34 if (left < right) { 35 dp = partition(n, left, right);//分治法,返回中轴下标 36 quicksort(n, left, dp - 1);//左边递归快排 37 quicksort(n, dp + 1, right);//右边递归快排 38 } 39 } 40 41 /** 42 * 快排核心算法,并返回中轴下标 43 * @param n 要分治的数组 44 * @param left 首位下标 45 * @param right 末位下标 46 * @return 47 */ 48 static int partition(int n[], int left, int right) { 49 50 //数组的第一个作为中轴(顺道保留了左值) 51 int pivot = n[left]; 52 System.out.println("==================排序前===================="); 53 System.out.println("中轴值="+pivot); 54 System.out.println("=======每次分治========= ,left="+left+",n[left]="+n[left]+",right="+right+",n[right]="+right+""); 55 //左<右才执行,即为一直到i=j时为止,此时ij碰撞的位置就是中轴 56 while (left < right) { 57 //找到第一个比中轴小的数n[rigth] 58 while (left < right && n[right] >= pivot){ 59 right--; 60 } 61 //把第一个比中轴小的输n[right]赋值给n[left],然后left右移一位 62 if (left < right){ 63 System.out.println("把n["+right+"]赋值给n["+left+"],left右移一位"); 64 n[left++] = n[right]; 65 } 66 //找到第一个比中轴大的数n[left] 67 while (left < right && n[left] <= pivot){ 68 left++; 69 } 70 //把第一个比中轴大的数n[left]赋值给n[right],并right左移一位 71 if (left < right){ 72 System.out.println("把n["+left+"]赋值给n["+right+"],right右移一位"); 73 n[right--] = n[left]; 74 } 75 } 76 //中轴赋值给最终左值(下一个递归的中轴下标) 77 n[left] = pivot; 78 System.out.println("==================排序后===================="); 79 System.out.println("中轴值="+pivot+"下标="+left); 80 System.out.println("left="+left+",n[left]="+n[left]+",right="+right+",n[right]="+right+""); 81 82 for(int a:n){ 83 System.out.print(a); 84 } 85 System.out.println(); 86 //返回中轴下标 87 return left; 88 89 } 90 }