JAVA 排序的几个案例

我们新建一个工具类

这个工具类 便于我们方便去 做测试 或者是 学习
嗯…我们给它取名字为 Tool 吧
在这里插入图片描述
为了便于测试 ,我们 写一个方法 来方便用户创建 数组 以便于排序

//定义一个静态方法 我们跟JDK 中提供的 Arrays 和 Math 工具类 去比较的话 方法几乎都是静态的 这样方便引用
//我们定义一个静态的 方法  返回值的类型 是int[]  也就是int 类型的 数组
//参数1:我们为这个 自定义即将生成的 数组  既定一个长度  index
//参数2:我们给这个数组的数字区间 一个最大值~ max   最小是 0 来的

    public static int[] buildArray(int index ,int max){
    
    	//动态定义 数组 长度为 index
    	
        int[] a=new int[index];
        
        //for 循环为 每一个 赋值
        
        for (int i = 0; i <index ; i++) {
        
        	//每一次都要 重新为 对象 赋值 这样 才能达到 随机数的效果
        	
            Random random= new Random();
            int i1 = random.nextInt(max);
            a[i]=i1;
        }
        
        //将这个 整型的 数组返回~ 
        
        return  a;
    }

定义一个冒泡排序的方法

//定义一个 函数 从小到大 冒泡 排序
    public static int[] doSortTolarge(int num[]){
    
    //解释一下 这里为什么是 length-1呢?
    //原因很简单 ,青蛙跳井的故事 ,一只青蛙跳出一口10米的井,白天跳4米 晚上睡觉 滑下去3米  问:几天可以跳出去呢?
    //如果你斩钉截铁的回答 10天 那么 你就打错了  事实上 这只呱在第7天的 时候就出去了 (自己去算);
    //分析一下这个条件 首先 小于length 那么 遍历最大会在length-1 的地方 
    //为什么再 -1 呢? 因为 最后以为数 一定是 最大的那一个 ,已经没有 必要去 比了
    
        for (int i = 0; i <num.length-1 ; i++) {
        
        //子循环 很灵活 你可以依照这个公式 去写另一种 形式~
        
            for ( int j = 0; j < num.length - 1 - i  ;  j++ ) {
            
            //判断!这个判断的 大于小于  觉得 你的这个方法是 从大到小  还是 从小到大
            
                if ( num[j] > num[j+1] ){   //大于号 恰巧相反  是从小到大
                    int temp = num[j];
                    num[j] = num[j+1];
                    num[j+1] = temp;
                }
            }
        }
        return num;
    }

//如果你说 直接用    Arrays.sort( num );   不就可以了么!  那么~你说的对 从小到大 是这样的呢

再来一个String 类的方法
这个方法类似与toArray().toString();

public static String show(int variable[]){
        String s="";
        for (int i = 0; i <variable.length ; i++) {
            s+=variable[i]+",";
        }
        //截取字符串  
        //参数1 : 下标,角标,index 从 哪里开始 ?
        //参数2: 从哪里结束?
        String s1 = s.substring(0, s.length() - 1);
        
        return s1;
    }

定义一个选择排序的方法

for(int i=0 ; i<num.length-1 ; i++ ){
	for(int j=i+1 ; j.length ;j++ ){
		if( num[i] > num[j] ){
		int temp = num[i];
		num[i] = num[j];
		num[j] =temp;
		}
	}
}

定义一个 二分法排序

private void twoPointQuery() {
   int[] source = {1, 2, 3, 6, 7, 8, 10};
        //查找6的索引
        int num = 12;//要查找的数字
        int start = 0;//查找的起始角标
        int end = source.length - 1;//查找的结尾角标
        int mid = (start + end) / 2;//查找的中间角标
        while (num != source[mid]) {
            if (source[mid] > num) {
                end = mid - 1;
            } else if (source[mid] < num) {
                start = mid + 1;
            }
            //防止死循环
            if (start>end){
                mid=-1;// -1代表没有这个数字
                break;
            }
            mid = (start + end) / 2;
        }

        // 循环结束的时候,mid的值即为要查找的角标值
        Log.d("======", "要查找的num的角标为: "+mid);
    }

定义一个快速排序

/**
     * 快速排序算法
     */
    public void quickSort(int[] list, int left, int right) {
        if (left < right) {
            // 分割数组,找到分割点
            int point = partition(list, left, right);

            // 递归调用,对左子数组进行快速排序
            quickSort(list, left, point - 1);
            // 递归调用,对右子数组进行快速排序
            quickSort(list, point + 1, right);
        }

    }

    /**
 * 分割数组,找到分割点
 */
private int partition(int[] list, int left, int right) {
    // 用数组的第一个元素作为基准数
    int first = list[left];
    while (left < right) {
        while (left < right && list[right] >= first) {
            right--;
        }
        // 交换
        swap(list, left, right);

        while (left < right && list[left] <= first) {
            left++;
        }
        // 交换
        swap(list, left, right);
    }
    // 返回分割点所在的位置
    return left;
}

/**
 * 交换数组中两个位置的元素
 */
private void swap(int[] list, int left, int right) {
    int temp;
    if (list != null && list.length > 0) {
        temp = list[left];
        list[left] = list[right];
        list[right] = temp;
    }
}

具体的快速排序 可以参照
https://blog.csdn.net/sinat_20177327/article/details/76560079
感谢该作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值