一、快速排序和插入排序
首先考虑单独的快速排序和插入排序算法,这里利用算法导论第三版的伪码进行展示。
1、快速排序
代码实现:
public void quickSort(int[] arr, int left, int right) {
if (left> right) {
int mid = partition(arr, left, right);
quickAndInsertSort(arr, left, mid - 1);
quickAndInsertSort(arr, mid + 1, right);
}
}
public int partition(int[] arr, int left, int right) {
int mid=left+(right-left)/2;
getThreeMid(arr,left,mid,right);//对主元选取进行优化,此处选择第一个、中间、最后一个的中间值作为主元。
int base = arr[right];
int p = left - 1;
for (int i = left; i < right; i++) {
if (arr[i] <= base) {
p++;
exchange(arr,p,i);
}
}
p++;
exchange(arr,p,right);
return p;
}
public void getThreeMid(int[] arr,int left,int mid,int right){
if(arr[left]>arr[right])
exchange(arr,left,right);
if(arr[mid]<arr[right])
{
if(arr[mid]>arr[left])
exchange(arr,mid,right);
else
exchange(arr,left,right);
}
}
public void exchange(int[] arr,int q,int p){
int temp=arr[q];
arr[q]=arr[p];
arr[p]=temp;
}
2、插入排序
伪代码: