一直想复习下算法,先把经典的快排复习下,好好理解下分治思想:
先介绍快速排序的算法过程:
[1].记录第一个数位置和最后一个数位置; int i = low; int j = high;[2].找到主元位置,可以是第一个数,也可以是最后一个,或者随机的一个位置,一般可以以数组中第一个位置的数,
int povit = a[low],主元选择好了就记录不改变它的值;
[3].如果主元是第一个数,则由 j 从后向前搜索,直到找到第一个小于主元的数,与主元进行交换位置.
[4].然后由 i 从前向后搜索,找到第一个大于主元的数,并与主元交换位置.
[5].重复[3],[4]步骤,直到 i = j;
a[0] ..........a[7]
12,3,5,44,21,8,56,2
主元:a[0] = 12;
-----------------------------------------------------------------
2,3,5,44,21,8,56,12 i = 1; j = 7;
2,3,5,12,21,8,56,44 i = 3;j =6;
---------------------- 一趟完成,开始第二趟------------------------
2,3,5,8,21,12,56,44 i = 4;j = 5;
2,3,5,8,12,21,56,44 i = 4;j = 4;
---------------------- 一趟完整移位结束,主元移到了 4 的位置------------------------
----------------------此时由主元位置分为前后2个数组-------------------------------
{2,3,5,8} 12 {21,56,44}
----------------------递归对前后2个数组进行上述移位操作---------------------------
package test;
import java.util.Date;
import java.util.Iterator;
import java.util.Properties;
public class test {
public static void main(String args[])
{
test t = new test();
Comparable a[] = {12,3,5,44,21,8,56,2};
t.quickSort(a, 0, a.length-1);
for(Comparable c : a)
{
System.out.print(c.toString()+",");
}
}
public void quickSort(Comparable a[],int low,int high)
{
if(low < high)
{
int i = partition(a,low,high);
//再递归移位i前面一个数组
quickSort(a, low,i-1);
//再递归移位i后面一个数组
quickSort(a, i+1, high);
}
}
public int partition(Comparable a[],int low,int high)
{
int i = low;
int j = high;
//主元
Comparable pivot = a[low];
if(low<high)
{
while(i != j)
{
printA(a);
//从j开始往前扫描直到第一个小于主元的数字出现,与主元交换
while(i < j)
{
if(a[j].compareTo(pivot) < 0)
{
swap(a, j,i);
break;
}
j--;
}
if(i < j)
{
//此时,因为与i互换了位置,i需要向后移动一位
i++;
}
//从i开始往后扫描,直到第一个大于主元的数字出现,与主元交换
while(i<j)
{
if(a[i].compareTo(pivot) > 0)
{
swap(a,i,j);
break;
}
i++;
}
if(i<j)
{
//此时,因为与j互换了位置,j需要向前移动一位
j--;
}
printA(a);
}
}
return i;
}
public int partition2(Comparable a[],int l, int r)
{
int i = l, j = r;
Comparable x = a[l]; //s[l]即s[i]就是第一个坑
while (i < j)
{
// 从右向左找小于x的数来填s[i]
while(i < j && a[j].compareTo(x) >= 0)
j--;
if(i < j)
{
a[i] = a[j]; //将s[j]填到s[i]中,s[j]就形成了一个新的坑
i++;
}
// 从左向右找大于或等于x的数来填s[j]
while(i < j && a[i].compareTo(x) < 0)
i++;
if(i < j)
{
a[j] = a[i]; //将s[i]填到s[j]中,s[i]就形成了一个新的坑
j--;
}
}
//退出时,i等于j。将x填到这个坑中。
a[i] = x;
return i;
}
public void swap(Comparable a[],int i, int j)
{
Comparable temp = a[i];
a[i] = a[j];
a[j] = temp;
}
public void printA(Comparable a[])
{
for(Comparable c : a)
{
System.out.print(c.toString()+",");
}
System.out.println();
}
}
parttition2 也是很好理解的,出自 http://blog.youkuaiyun.com/morewindows/article/details/6684558