快速排序和归并排序
快速排序
快排算法属于一种分治的算法,分治算法的基本步骤:
- 分成子问题
- 递归处理子问题
- 子问题合并
那么我们首先写出快速排序的基本模板(Java)
public void quickSort(int arr[],int lo,int high) {
if (lo >= high) return;//递归的结束条件
int x = arr[(lo+high)/2];
int i = lo-1,j = high+1; //相当于定义两个指针,i从数组头开始匹配,j从数组尾部开始匹配。
while(i < j) {//数组的匹配逻辑,当i遇到比x大的数停止,j遇到比x小的数停止,之后将两个数交换.这样比X小的数就被放在了X前面,比X大的数放在了后面。
while(arr[++i] < x);
while(arr[--j] > x);
if(i < j) swap(arr[i],arr[j]);
}
//递归调用函数,将数组排序。
quickSort(arr,lo,j);
quickSort(arr,j+1,high);
}
快速排序需要注意的点
1.在反复理解模板的时候,注意它的递归结束条件,可以是=或>=否则会
陷入死循环。
2.两指针最后应该会相遇,所以递归条件便可以分为[lo,j]和[j+1,high]
两个区间
归并排序
归并排序我最开始是在《算法》的书中看到的,但是说实话,对于上面的代码确实不是很理解。
归并排序我认为是也是分治思想的一种实现,归并排序主要步骤是将数组分为不同的组,之后在归并将其排序。
归并排序模板(Java)
public void mergeSort(int arr[],int lo,int high) {
if(lo >= high) return;
int mid = (lo+high)/2;
mergeSort(arr,lo,mid);
mergeSort(arr,mid+1,high);
int i = lo,j = mid+1 ,k = 0,temp[high-lo+1];
while(i <= mid && j <= high) {
if (arr[i++] >= arr[j++]) temp[k++] = arr[j];
else temp[k++] = arr[i];
}
while (i <= mid) temp[k++] = arr[i++];
while (j <= high) temp[k++] = arr[j++];
for(i = lo,k = 0;i < high;i++) {
arr[i] = temp[k++];
}
}