• java int数组任何数之间间隔不能对于指定数,内付极速排序


    public static void main(String[] args) {
            int []arr = {300,310, 210,313,334,360,255,233,275,274,410,510,559,609};
            //对数组进行排序;
            FastSort.sort(arr, 0, arr.length - 1);
            
            //输出控制台看看排序后的数据
            for (int i = 0; i < arr.length; i++) {
                System.out.print("====" + arr[i]);
            }
            
            //用一个集合来装匹配的数据
            List<Integer> mylist = new ArrayList<Integer>();
            
            //输出一个空白换行
            System.out.println();
            
            //先把第一个最小的数据存起来
            mylist.add(arr[0]);
            
            //记录最后保存的数据的索引
            int inIndex = 0;
            for (int i = 1; i < arr.length; i++) {
                //判断一下遍历的数据和最后一个保存的数据的距离,大于或等于50就保存
                if (arr[i] - arr[inIndex] >= 50) {
                    mylist.add(arr[i]);
                    inIndex = i;
                }
            }
            
            //遍历保存的数据,看看对不对
            for (int i = 0; i < mylist.size(); i++) {
                System.out.print("====" + mylist.get(i));
            }
            
        }

    极速排序

    public class FastSort {
        /**  
         * @Description 这个方法是用来把数组分分成两部分并根据参照点稍作位置调整数组元素位置的
         * @param arr 用来排序的数组
         * @param left 初始是数组的最左端索引,然后从第二次递归开始就由 point 决定,起到位置索引作用
         * @param right 初始是数组的最右端索引,然后从第二次递归开始就由 point 决定,起到位置索引作用
         * @param point 参照点,初始是初始是数组的最右端元素,然后从第二次递归开始就是 被划分成两部分的数组的两个最右端元素
         * @return int 和参照点类似,返回的是参照点所在位置的前一个位置
         * @throws
         */
        private static int partition(int[] arr, int left, int right, int point) {
            int leftP = left -1;//leftP起指针作用,记录准备要交换位置的元素的索引
            int rightP = right;//rightP起指针作用,记录准备要交换位置的元素的索引
            while(true){
                while (leftP < rightP && arr[++leftP] < point);//用参照点从左往右一直对比,直到找到比参照点大的数就停下
                while (rightP > leftP && arr[--rightP] > point);//用参照点从右往左一直对比,直到找到比参照点小的数就停下
                if (leftP >= rightP) {//如果条件符合,证明左右两头往中间已经相遇并对比完所有元素
                    break;
                }else{
                    int temp = arr[leftP];//用刚才左右两头停下所记录的位置交换元素,这里的交换只是把小的元素移到左边,大的移到右边
                    arr[leftP] = arr[rightP];
                    arr[rightP] = temp;
                }
            }
            int temp = arr[leftP];//当上面的while循环都停止后,leftP 所在位置的元素就是大于或等于 参照点 的元素,所以把最大的放后面
            arr[leftP] = arr[right];
            arr[right] = temp;
            return leftP;//返回左边开始的索引位置,用于下一轮切分数组
        }
    
    
        /**  
         * @Description 排序的方法,要用到递归
         * @param arr 用于排序的数组
         * @param left 这里的左并不一定是数组的最左索引位置,也有可能是数组切分后的左边
         * @param right 和 left 同理
         * @throws
         */
        public static void sort(int[] arr, int left, int right){
            if (left >= right) {//排序结束
                return;
            }else{
                int point = arr[right];//参照点是数组切分后的最右边元素
                int partition = partition(arr, left, right, point);//把数组切分,并把大于参照点的值放在右边,小于的放左,
                sort(arr, left, partition -1);//把切分后的数组继续且
                sort(arr, partition +1 , right);//切到最后就是排序结束,此时发现已经排好序了
            }
        }
    
        public static void main(String[] args) {
            int[] arr = {19,4,6,65,15,2,0,12,13,20,25};
            sort(arr, 0, arr.length - 1);
            for (int i = 0; i < arr.length; i++) {
                System.out.print(arr[i]+" ");
            }
        }
    
    }
  • 相关阅读:
    对我比较有用的网站
    ubuntu各种安装
    arabaraba
    镜像源相关
    硬盘相关
    python模块
    递归和循环两种方式实现未知维度集合的笛卡尔积
    单例模式的两种实现方式
    经典String str = new String("abc")内存分配问题
    js方法的命名不能使用表单元素的名称或ID
  • 原文地址:https://www.cnblogs.com/xjbBill/p/9316033.html
Copyright © 2020-2023  润新知