package sort_book_datastruction;
import java.util.ArrayList;
import java.util.Arrays;
/**
* 快速排序:
* 基本思想:通过一趟排序将待排序列分割成两部分,其中一部分记录的关键字比另一部分记录的关键字小,
* 则可以分别对两部分记录继续进行排序,以达到整个序列有序;
* 每一趟能够将枢轴元素放在正确的位置上。
*具体做法:附设两个指针low和high,他们的初值分别是low和high,设枢轴记录的关键字为pivotkey,
* 则首先从high所指的位置起向前搜索找到第一个关键字小于pivotkey的记录和枢轴互相交换,
* 然后从low所指的位置起向后搜索,找到第一个关键字大于pivotkey的记录和枢轴互相交换,
* 重复这两步,直至low=high为止;
*改进:每交换一对记录需进行三次记录赋值操作,而实际过程中对枢轴记录的赋值是多余的,因为只有一趟排序结束时,即
* low=high的位置才是枢轴记录的最后位置。
* @author Administrator
*
*/
public class QuikSort {
// public void swap(int[] array,int low,int high){
// int temp = array[low];
// array[low] = array[ high];
// array[high] =temp;
// }
public int getMiddle(int[] array,int low ,int high){
if(array.length <=0)
return -1;
int pivotkey = array[low];//用子表的第一个记录作为基准元素
while(low<high){ //从表的两端交替的向中间扫描
while(low<high&&array[high]>=pivotkey)
high--;
//swap(array,low,high);
array[low]=array[high];//改进的方法;将比枢轴记录小的记录移动到低端;
while(low<high &&array[low]<=pivotkey)
low++;
//swap(array,low,high);
array[high]=array[low];//将枢轴记录大的记录移动到高端;
}
array[low] = pivotkey;//枢轴记录到位;
return low;
}
public void Qsort(int[] array,int low,int high){
if(low<=high){//长度大于1
int pivotloc = getMiddle(array,low,high);//将顺序表array一分为2
Qsort(array,low,pivotloc-1);//对低子表做递归排序
Qsort(array,pivotloc+1,high);//对高子表做递归排序
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
QuikSort qs = new QuikSort();
int[] array = {49,38,65,97,76,13,27,49};
qs.Qsort(array, 0, array.length-1);
System.out.println("QUickSort:"+Arrays.toString(array));
}
}
[JAVA]快速排序
最新推荐文章于 2024-07-17 10:35:12 发布