快速排序:该算法是在数组中选择一个元素作为主元(pivot),将数组分为两部分,前部分所有元素小于等于主元,后部分所有元素大于主元。对第一部分递归地应用快速排序算法,然后对第二部分递归地应用快速排序算法。
/*快速排序清单*/
public class QuickSort {
public static void quickSort(int[] list){
quickSort(list,0,list.length-1);
}
private static void quickSort(int[] list,int first,int last){
if(last>first){
int pivotIndex=partition(list,first,last);//主元的下表
quickSort(list,first,pivotIndex-1);//对主元前边的部分快速排序
quickSort(list,pivotIndex+1,last);//对主元后边的部分快速排序
}
}
private static int partition(int[]list,int first,int last){//整个方法结束时返回主元的下标
int pivot=list[first]; //选择第一个元素作为主元
int low=first+1;//low指向数组第二个元素
int high=last;//high指向数组最后一个元素
while(high>low){
while(low<=high&&list[low]<=pivot)//从左侧开始找第一个大于主元的元素
low++;
while(low<=high&&list[high]>pivot)//从右侧开始找小于等于主元的元素
high--;
if(high>low){//交换这两个元素
int temp=list[high];
list[high]=list[low];
list[low]=temp;
}
}
while(high>first&&list[high]>=pivot)
high--;
if(pivot>list[high]){//如果主元被移动,返回将数组分为两部分主元的新下标
list[first]=list[high];
list[high]=pivot;
return high;
}
else{//否则返回原始下标
return first;
}
}
public static void main(String[] args) {
int[] list={2,3,2,5,6,1,-2,3,14,-12};
quickSort(list);
for(int i=0;i<list.length;i++)
System.out.print(list[i]+" ");
}
}
归并排序和快速排序都使用了分治法,对于归并排序,大量的工作是将两个子线性表进行归并,归并是在子线性表排好序后进行的;对于快速排序,大量工作是将线性表划分为两个子线性表,划分是在子线性表排好序前进行的。在最差情况下,归并排序的效率高于快速排序,但是,在平均情况下,两者效率相同。归并排序在归并两个子数组时需要一个临时数组,而快速排序不需要额外的数组空间,因此,快速排序的空间效率高于归并排序。