publicstaticvoidmergeSort(int[] arr){mergeSortInternally(arr,0,arr.length -1);}privatestaticvoidmergeSortInternally(int[] arr,int p,int r){//递归终止条件if(p >= r)return;//取p到r之间的中间位置qint q =(p+r)/2;//分治递归mergeSortInternally(arr,p,q);mergeSortInternally(arr, q+1, r);//合并merge(arr,p,q,r);}privatestaticvoidmerge(int[] arr,int p,int q,int r){int i = p;int j = q+1;int k =0;//申请临时数组int[] tmp =newint[r-p+1];while(i <= q && j <= r){if(arr[i]<= arr[j]){
tmp[k++]= arr[i++];}else{
tmp[k++]= arr[j++];}}//判断那个子数组中有剩余数int start = i;int end = q;if(j <= r){
start = j;
end = r;}//将剩余的数据拷贝到临时数组while(start <= end){
tmp[k++]= arr[start++];}//将临时数组中的数据拷贝到原数组for(int l =0; l <= r - p; l++){
arr[p+l]= tmp[l];}}
快速排序
核心思想
如果要排序数组中下标从 p 到 r 之间的一组数据,我们选择 p 到 r 之间的任意一个数据作为 pivot(分区点)。 我们遍历 p 到 r 之间的数据,将小于 pivot 的放到左边,将大于 pivot 的放到右边,将 pivot 放到中间。经过这一步骤之后,数组 p 到 r 之间的数据就被分成了三个部分,前面 p 到 q-1 之间都是小于 pivot 的,中间是 pivot,后面的 q+1 到 r 之间是大于 pivot 的。根据分治、递归的处理思想,我们可以用递归排序下标从 p 到 q-1 之间的数据和下标从 q+1 到 r 之间的数据,直到区间缩小为 1,就说明所有的数据都有序了。