Java 排序:冒泡排序、插入排序、选择排序

import org.junit.Test;

public class SortTest {

    @Test
    public void test() {
        int[] a = {5, 6, 9, 2, 8, 3, 7};

//        int[] sortedArray = bubbleSort(a, a.length);

//        int[] sortedArray = insertionSort(a, a.length);

        int[] sortedArray = selectionSort(a, a.length);

        for (int i = 0; i < sortedArray.length; i++) {
            System.out.print(sortedArray[i] + ",");
        }

    }

    /**
     * 选择排序:分已排序区间和未排序区间,每次会从未排序区间中找到最小的元素,将其放到已排序区间的末尾
     *
     * @param a
     * @param n
     * @return
     */
    private int[] selectionSort(int[] a, int n) {
        if (n <= 1) return a;

        for (int i = 0; i < n - 1; i++) {

            int minIndex = i;

            for (int j = i; j < n; j++) {
                if (a[j] < a[minIndex]) {   //找出最小元素的位置
                    minIndex = j;
                }
            }

            //数据交换
            if (minIndex != i){
                int temp = a[i];
                a[i] = a[minIndex];
                a[minIndex] = temp;
            }
        }

        return a;
    }

    /**
     * 插入排序:从第一个元素开始作为已排好序,后面每个元素找到前面排好序的一个位置,插入
     *
     * @param a
     * @param n
     * @return
     */
    private int[] insertionSort(int[] a, int n) {
        if (n <= 1) {
            return a;
        }

        for (int i = 1; i < n; i++) {
            int newValue = a[i];    //新插入元素
            int j = i - 1;    //已排好序的位置

            for (; j >= 0; --j) {
                if (a[j] < newValue) {
                    a[j + 1] = a[j];  //移动位置
                } else {
                    break;
                }
            }
            a[j + 1] = newValue;  //插入元素
        }
        return a;
    }

    /**
     * 冒泡排序:冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求。
     * 如果不满足就让它俩互换。
     *
     * @param a 数组
     * @param n 数组大小
     */
    private int[] bubbleSort(int[] a, int n) {
        if (n <= 1)
            return a;

        for (int i = 0; i < n; i++) {
            //数据是否交换
            boolean isSwap = false;
            for (int j = 0; j < n - i - 1; j++) {
                if (a[j] < a[j + 1]) {
                    int temp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = temp;

                    isSwap = true;
                }
            }
            //数据没有交换,就可退出
            if (!isSwap)
                break;
        }

        return a;
    }


}

你可能感兴趣的:(Java排序)