常见排序

冒泡排序

思路:俩俩交换,大的放在后面,第一次排序后最大值已在数组末尾。因为俩俩交换,需要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;
            }
        }
    }

 

posted @ 2020-08-14 23:52  huiyii  阅读(117)  评论(0编辑  收藏  举报