zoukankan      html  css  js  c++  java
  • 常见排序

    冒泡排序

    思路:俩俩交换,大的放在后面,第一次排序后最大值已在数组末尾。因为俩俩交换,需要n-1趟排序(比如10个数,需要9趟排序)

    代码实现要点:两个for循环,外层循环控制排序的趟数,内层循环控制比较的次数每趟过后,比较的次数都应该要减1

    public void maoPao(){
        int[] array=new int[]{6,2,3,4,5,7,9,8,1,0};
        int len=array.length;
        //外层循环控制排序的趟数
        for(int i=0;i<len-1;i++){
            //内层循环控制当前趟数需要比较的次数
            for(int j=0;j<len-1-i;j++){
                //如果前一个数大于后一个数,就交换值,把大的数放后面
                if(array[j]>array[j+1]){
                    int temp=array[j];
                    array[j]=array[j+1];
                    array[j+1]=temp;
                }
            }
        }
        for(int x:array){
            System.out.print(x);
        }
    }

    选择排序

    思路:找到数组中最大的元素,与数组最后一位元素交换。当只有一个数时,则不需要选择了,因此需要n-1趟排序

    代码实现要点:两个for循环,外层循环控制排序的趟数,内层循环找到当前趟数的最大值,随后与当前趟数组最后的一位元素交换

    public void xaunZe(){
        int[] array=new int[]{6,2,3,4,5,7,9,8,1,0};
        int len=array.length;
        //外层循环控制排序的趟数
        for(int i=0;i<len-1;i++){
            //定义初始最大值为array[0],每趟查找到的最大值的索引maxIndex
            int max=array[0];
            int maxIndex=0;
            //内层循环找到当前趟数的最大值
            for(int j=0;j<len-i;j++){
                if(array[j]>max){
                    max=array[j];
                    maxIndex=j;
                }
            }
            //将最大值和最后一个值交换,最大值放在最后
            array[maxIndex]=array[len-1-i];
            array[len-1-i]=max;
        }
        for(int x:array){
            System.out.print(x);
        }
    }

    快速排序

    思路:在数组中找一个元素(节点),比它小的放在节点的左边,比它大的放在节点右边。一趟下来,比节点小的在左边,比节点大的在右边。不断执行这个操作….

    代码实现:支点取中间,使用L和R表示数组的最小和最大位置。不断进行比较,直到找到比支点小(大)的数,随后交换,不断减小范围。递归L到支点前一个元素(j)。递归支点后一个元素(i)到R元素

    //快速排序
    public static int[] kuaiSu(int[] array,int l,int r){
        int i=l;
        int j=r;
        //定义支点为中间点
        int mid=array[(l+r)/2];
        while (i<=j){
            //左半边查找,直到找到比mid大的值,结束循环
            while (array[i]<mid){
                i++;
            }
            //右半边查找,直到找到比mid小的值,结束循环
            while (array[j]>mid){
                j--;
            }
            //此时找到 左边比mid大的值,右边比mid小的值,进行交换
            if(i<=j){
                int temp=array[i];
                array[i]=array[j];
                array[j]=temp;
                i++;
                j--;
            }
        }
        //上面的while保证了第一趟排序时,左边的值比mid小,右边的值比mid大,但是左右两边的数仍是无序的,需要调整mid的值,缩小范围继续比较、交换
        //“左边”做排序,直到剩下一个数
        if (l<j){
            kuaiSu(array,l,j);
        }
        //“右边”做排序,直到剩下一个数
        if (i<r){
            kuaiSu(array,i,r);
        }
        return array;
    }

    二分查找

        public void search(){
            int find=5;
            int[] array=new int[]{1,3,5,7,9,11,13,15,17};
            int s=0;
            int e=array.length-1;
            int m;
            while (s<=e){
                m=(s+e)/2;
                if(find>array[m]){
                    s=m;
                }
                if(find<array[m]){
                    e=m;
                }
                if(find==array[m]){
                    System.out.println(m);
                    break;
                }
            }
        }
  • 相关阅读:
    软件工程(2019)第二次作业
    软件工程(2019)第一次作业
    Java基础篇之Java特性
    软件工程(2019)结对编程第二次作业
    软件工程(2019)结对编程第一次作业
    软件工程(2019)第三次作业
    软件工程(2019)第二次作业
    软件工程(2019)第一次作业
    结对编程作业 2
    结对编程作业 1
  • 原文地址:https://www.cnblogs.com/yjh1995/p/13507102.html
Copyright © 2011-2022 走看看