题解 | #排序#

排序

https://www.nowcoder.com/practice/2baf799ea0594abd974d37139de27896

import java.util.*;
public class Solution{
    //快速排序
    public int[] MySort(int[] arr) {
        qsort(arr,0,arr.length-1);
        return arr;
    }
    public void qsort(int []a,int l,int r){
        int mid = a[l];
        int left = l;
        int right = r;
        int temp =0;
        int i=0;
        while(left<right){
             //右边找到比a[l]小的第一个数;和a[l]相等的数不移动,比mid大的数不断后移
             //先right--能确保left和right相等时a[left]<=a[mid],上一轮已经比较替换
            while(a[right]>=mid&&left<right){
                right--;
            }
            //左边找到比a[l]大的第一个数;和a[l]相等的数不移动,比mid小的数不断前移
            while(a[left]<=mid&&left<right){
                left++;
            }
            temp = a[left];
            a[left] = a[right];
            a[right] = temp;
               
        }
        //最左边的数a[l]和a[left]替换,一次递归只确定一个数a[l]的位置
        temp = a[left];
        a[left] = a[l];
        a[l] = temp;

        if(left>l){
            qsort(a,l,left-1);
        }
        if(right<r){
            qsort(a,right+1,r);
        }
    }
    //这种方法,当数组中有好多重复值时,会造成mid过多重复移动,超时
    public void qsort2(int []a,int l,int r){
        int mid = a[l];
        int left = l;
        int right = r;
        int temp =0;
        int i=0;
        while(left<right){
            //左边找到比flag大的第一个数;将和mid相等的数不断往中间和后面移动,比mid小的数不断前移
            while(a[left]<mid&&left<right){
                left++;
            }
            //右边找到比flag小的第一个数;将和mid相等的数不断往中间和前面移动,比mid大的数不断后移
            while(a[right]>mid&&left<right){
                right--;
            }
            temp = a[left];
            a[left] = a[right];
            a[right] = temp;
            //确保和mid相等的数至少一个移到中间
            if (a[left] == mid && a[right] == mid) {
                left++;
            } else if (a[left] != mid && a[right] == mid) {
                left++;
            } else if (a[left] == mid && a[right] != mid) {
                right --;
            } else if (a[left] != mid && a[right] != mid) {
                left++;
                right --;
            }        
        }
       
        if(left>l){
            qsort(a,l,left-1);
        }
        if(right<r){
            qsort(a,right+1,r);
        }
    }

// void Quick_Sort(int [] arr, int begin, int end){
//     if(begin > end)
//         return;
//     int tmp = arr[begin];
//     int i = begin;
//     int j = end;
//     while(i != j){
//         while(arr[j] >= tmp && j > i)//相等的不移动
//             j--;
//         while(arr[i] <= tmp && j > i)
//             i++;
//         if(j > i){//相等的数没比较
//             int t = arr[i];
//             arr[i] = arr[j];
//             arr[j] = t;
//         }
//     }
//     arr[begin] = arr[i];
//     arr[i] = tmp;
//     Quick_Sort(arr, begin, i-1);
//     Quick_Sort(arr, i+1, end);
// }
}

全部评论

相关推荐

01-14 19:01
吉首大学 Java
黑皮白袜臭脚体育生:加个项目吧,一般需要两个项目一业务一轮子呢,简历统一按使用了什么技术实现了什么功能解决了什么问题或提升了什么性能指标来写
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务