JAVA中基本的四种排序(冒泡排序,选择排序,插入排序,快速排序)

冒泡排序


/**
* 从前往后,依次比较相邻的两个数,把较大的数放到后面。一次循环,可以在当前最末尾位置得到一个当前最大值。
*/

public class orderBy1 {

    public static void main(String[] args) {
        int score[] = {67, 69, 75, 88};

        for(int i =0;i < score.length - 1;i++)
        {
            for(int j = 0;j <  score.length - 1-i;j++)// j开始等于0,
            {
                if(score[j] < score[j+1])
                {
                    int temp = score[j];
                    score[j] = score[j+1];
                    score[j+1] = temp;
                }
            }

        }
        for (int i = 0; i <score.length ; i++) {
            System.out.println(score[i]);
        }

    }

}

选择排序


注意选择排序与冒泡排序的区别:
冒泡排序通过依次交换相邻两个顺序不合法的元素位置,从而将当前最小(大)元素放到合适的位置:
而选择排序每遍历一次都记住了当前最小(大)元素的位置,最后仅需一次交换操作即可将其放到合适的位置。

/**
* 从数组中找到最小的元素,和第一个位置的元素互换。
* 从第二个位置开始,找到最小的元素,和第二个位置的元素互换。
* 直到选出array.length-1个较小元素,剩下的最大的元素自动 在最后一位。
*/

public class orderBy2 {

    public static void main(String[] args) {
        int arr[] = {67, 69, 75, 88};
        int minIndex, temp;
        for (int i = 0; i < arr.length - 1; i++) {
            minIndex = i;                         //每次都从已排序序列的末尾后一位开始
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[j] < arr[minIndex]) {     //寻找最小的数


·  minIndex = j;                 //将最小数的索引保存
                }
            }

            //放到已排序序列的末尾(即交换),该操作很有可能把稳定性打乱,所以选择排序是不稳定的排序算法
            temp = arr[i];
            arr[i] = arr[minIndex];
            arr[minIndex] = temp;
        }
        for (int i = 0; i <arr.length ; i++) {
            System.out.println(arr[i]);
        }

    }
}

插入排序


/**
*从第二个元素开始,将当前元素插入到前面对应位置,使当前元素i
和之前元素形成有序数组。
比较规则:
正常:
从第一个元素开始,若当前元素i小于有序数组中的元素j,则从该元素开始将有序数组依次后移一位,
并将当前元素i放置到该元素j位置。(插入)
简易:
从有序数组最后一个元素开始,若当前元素i小于该元素j,则交换当前元素和该元素。
*/

public class orderBy3 {

    public static void main(String[] args) {
        int arr[] = {67, 69, 75, 88};
        int pos,temp;
        for(int i=1;i<arr.length;i++){
            pos = i;
            while(pos!=0&&arr[pos]<arr[pos-1]){
                temp = arr[pos];
                arr[pos] = arr[pos-1];
                arr[pos-1] = temp;
                pos--;
            }
        }
        for (int i = 0; i <arr.length ; i++) {
            System.out.println(arr[i]);
        }
    }
}

快速排序(鸡尾酒排序)


/**
* 鸡尾酒是冒泡排序的升级版,该排序从左往右找出最大值后,再从右往左
找出最小值,类似鸡尾酒搅拌左右循环。在某些情况下,优于冒泡排序,
以序列(67,69,75,88)为例,鸡尾酒排序只需要访问两次(升序降序各一次 )
次序列就可以完成排序,但如果使用冒泡排序则需要四次。
*/

public class orderBy4 {
    public static void main(String[] args) {
        int arr[] = {67, 69, 75, 88};
        //依次将最大的数放置到数组末尾,将第二大的数放到倒数第二位...
        boolean changed;
        for(int i = 0;i < arr.length/2;i++){
            changed = false;
            //从前往后,比较相邻两个数,把大的放在后边.之前已放置成功的可以不再参与比较
            for(int j = i;j < arr.length-1-i;j++){

                if(arr[j]>arr[j+1]) {
                    swap(arr,j,j+1);
                    changed =true;
                }
            }
            if(!changed){
                break;
            }
            for(int j = arr.length-1-i; j > i; j--){

                if(arr[j]<arr[j-1]) {
                    swap(arr,j,j-1);
                    changed = true;
                }
            }
            if(!changed){
                break;
            }
        }
        for (int i = 0; i <arr.length ; i++) {
            System.out.println(arr[i]);
        }
    }
    public static void swap(int[] arr, int pos1, int pos2){
        int temp = arr[pos1];
        arr[pos1] = arr[pos2];
        arr[pos2] = temp;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_42844643/article/details/81316557
今日推荐