快速排序是标准C++库泛型排序的默认算法:分治策略
基本思路:
1.在数组中选定一个基准值(通常选择数组首个元素---》不可取,特别是对部分预排序的数组而言,会导致算法效率低下)
2.把大数组拆分成两个小数组---》规则:小于等于基准值的在左侧小数组,大于基准值的则放在右侧小数组,最后把基准值放在左侧小数组的末位。
3.递归处理步骤2,最终实现数组的排序。
快速排序Java代码实现:
/** * @author wuwh
* @date createTime:2016年2月21日 上午11:55:14 */
public class QuickSort{
public static void main(String[] args) {
int[] targetArray = new int[]{12,1,5,3,2,8,5,4,6,7,9,11,10};
sort(targetArray, 0, targetArray.length-1);
for (int i = 0; i < targetArray.length; i++) {
System.out.println("第"+(i+1)+"个元素是::"+targetArray[i]);
}
}
public static void sort(int[] array,int left,int right)
{
if (left<right) {
int middle = getMiddle(array,left,right);
sort(array, left, middle-1);
sort(array, middle+1, right);
}
}
private static int getMiddle(int[] array, int left, int right) {
//定义一个临时数组
int size = right - left +1;
int []tempArray = new int[size];
int tempLow = 0;
int tempHigh = size-1;
int index = left+1;
int base = array[left];
//从数组的left+1遍历至right,
//小于base的元素放在临时数组左边,大于base的放在临时数组右边
while(index<=right)
{
if (array[index]<=base) {
tempArray[tempLow++] = array[index++];
}
else {
tempArray[tempHigh--] = array[index++];
}
}
//把基准值base插入临时数组中...
tempArray[tempLow] = base;
//把排好序的临时数组的元素copy到原始数组中
for (int i = 0; i < size; i++) {
array[i+left] = tempArray[i];
}
//返回基准值base在原始数组中的下标值
return tempLow+left;
}
}