思想方法(分治思想)是把一个序列划分为两个子序列,使第一个子序列的所有元素都小于第二个子序列的所有元素。不断地进行这样的划分,最后构成n个序列,每个序列只有一个元素。这时,它们就是按递增顺序排序额序列了。
方法一:
public void QuickSort(int[] arr,int low,int high) { int index; while(low<high) { index=Split(arr,low,high); //枢点元素的下标 QuickSort(arr,low,index-1); QuickSort(arr,index+1,high); } } public int Split(int[] arr,int low,int high) { int i=low; int k; int key=arr[low]; for(k=low+1;k<=high;K++) { if(arr[k]<=key) { i=i+1; if(i!=k) { Swap(arr,i,k); //i<k并且k下标所在的元素小于arr[low]值,就交换 } } } Swap(arr,low,i); return i; } public void Swap(int[] arr,int i,int j) { int temp=arr[i]; arr[i]=arr[j]; arr[j]=temp; }
其实上面的条件判断还可以这样写。
if(arr[k]<=key&&++i<k)
{
Swap(arr,i,k);
}
方法二:
public void QuickSort(int[] arr,int low,int high)
{
int index;
while(low<high)
{
index=Split(arr,low,high);
QuickSort(arr,low,index-1);
QuickSort(arr,index+1,high);
}
}
public int Split(int[] arr,int low,int high)
{
int key=arr[low];
while(low<high)
{
//从后向前搜索比key小的值
while(arr[high]>=key&&low<high)
high--;
//比key小的放前边
arr[low]=arr[high];
//从前向后搜索比key大的值
while(arr[low]<=key&&low<high)
low++;
//比key大的放后边
arr[high]=arr[low];
}
arr[low]=key;//后边都比key大,前边都比key小 key放在枢点元素位置 此时low=high
return low;
}
posted on
浙公网安备 33010602011771号