一、快速排序
代码实现:
//快速排序
public static void fastSort(int[] arr){
//1、选取基准值
//2、让left从左往右找比基准值大的,right从右向左找比基准值小的
//3、再针对两个区间递归的进行之前的操作
quickHelper(arr,0,arr.length-1);
}
public static void quickHelper(int[] arr, int left, int right) {
if(left>=right){
//如果集合中只有一个元素或者没有元素,就不需要排序,直接返回
return;
}
//先找一个基准值
int index=partition(arr,left,right);
//递归的进行左右区域
quickHelper(arr,left,index-1);
quickHelper(arr,index+1,right);
}
public static int partition(int[] arr, int left, int right) {
//先选取最后一个元素为基准值
int baseValue=arr[right];
int i=left;
int j=right;
while(i<j){
while(i<j&&arr[i]<=baseValue){
i++;
}
while(i<j&&arr[j]>=baseValue){
j--;
}
//此时有两种情况,一种是i==j
//一种是left找到了比基准值大的,riht找到了比基准值小的,此时交换即可
if(i<j){
int tmp=arr[i];
arr[i]=arr[j];
arr[j]=tmp;
}
}
//当i和j重合的时候,j指向的就是比基准值大的元素
//此时交换
int tmp=arr[j];
arr[j]=arr[right];
arr[right]=tmp;
//此时i就是新的基准值
return i;
}
二、归并排序:能高效地针对链表进行排序,数组可以随机访问,这是一种“外部排序”的主要实现方式。“外部排序”:数据在磁盘中(外存中),数据量很大,无法加载进内存中。
//归并排序
public static void mergeSort(int[] arr){
mergeHelper(arr,0,arr.length);
}
public static void mergeHelper(int[] arr, int left, int right) {
if(right-left<=1){
//有1个元素或者没有元素
return;
}
//针对整个区域分成两个部分
int mid=(left+right)/2;
mergeHelper(arr,left,mid);
mergeHelper(arr,mid,right);
//合并
merge(arr,left,mid,right);
}
public static void merge(int[] arr, int left, int mid, int right) {
//借助一个临时空间
int cur1=left;
int cur2=mid;
int[] outputarr=new int[right-left];
int outputnum=0;
while(cur1<mid&&cur2<right){
if(arr[cur1]<arr[cur2]){
//就把cur1指向的元素插入到新数组中
outputarr[outputnum]=arr[cur1];
cur1++;
outputnum++;
}else{
outputarr[outputnum]=arr[cur2];
cur2++;
outputnum++;
}
}
//有一个区间的元素插入完了
while(cur1<mid){
outputarr[outputnum]=arr[cur1];
cur1++;
outputnum++;
}
while(cur2<right){
outputarr[outputnum]=arr[cur2];
cur2++;
outputnum++;
}
//合并完成
//放到原数组中
for(int i=0;i<right-left;i++){
arr[left+i]=outputarr[i];
}
}