简单排序

 

一、排序算法

分类:内部排序和外部排序

 

 

二、冒泡排序

      

 

     解析: 相邻的进行比较,大的向后移动;

                每一趟排序后,比较的次数会减一;

                如果在某趟排序中没有发生交换,则可以提前结束;

 

public class BubbleSort {
    public static void main(String[] args) {
        int[] arr = {3, -1, 9, 10, -2};
        sortArr1(arr);
        System.out.println(Arrays.toString(arr));
    }

    /**
     * 冒泡排序
     *
     * @param arr
     */
    public static void sortArr1(int[] arr) {
        int temp = 0;
        boolean flag = false;  //判断是否发生交换
        for (int i = arr.length - 1; i > 0; i--) {
            // 从本数组来看i最大为4;j最大为3
            // 一次循环为一趟排序
            for (int j = 0; j < i; j++) {
                if (arr[j] > arr[j + 1]) {
                    flag = true;
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
            if (!flag) {
                break; // 一趟排序完为false,则已经排好序
            } else {
                flag = false; // 若为true,则发生交换,还未完成,置为true;
            }
        }
    }

 

三、选择排序

       

 

        选择排序是:第一次从a[0]~a[n-1]中找出最小的数,与a[0]交换,每次只交换一次;以此类推;在第n-1次从a[n-2]~a[n-1]中找到最小的和a[]

         找到最小的方法:假设第一个为最小,和其他的挨个比较;

 

 1 public class BubbleSort {
 2     public static void main(String[] args) {
 3         int[] arr = {3, -1, 9, -8, 10, 5,4,9 ,-2};
 4         sortArr2(arr);
 5         System.out.println(Arrays.toString(arr));
 6     }
 7 
 8     /**
 9      * 选择排序
10      */
11     public static void sortArr2(int[] arr) {
12 
13         for (int i = 0; i < arr.length - 1; i++) {
14             int min = arr[i];   //假设最小值为arr[0]
15             int minIndex = i;   // 记录下标
16             for (int j = i+1; j < arr.length; j++) {
17                 if (min > arr[j]) {
18                     min = arr[j];  // 将小的值赋给min
19                     minIndex = j;
20                 }
21             }
22             // 一趟循环完成,将最小值和arr[0]交换
if (minIndex != i) {
23 arr[minIndex] = arr[i]; 24 arr[i] = min;
}
25 } 26 } 27 }

 

 

四、插入排序

       原理:1.把所有的元素分为两组,已排序和未排序

                  2.找到未排序的组中的第一个元素,向已经排序的组中进行插入

                  3.倒叙遍历已经排序的元素,依次和待插入的元素进行比较,直到找到一个元素小于等于待插入元素,就把待插入元素放到此位置,其他元素后移

                     

 

 /**
     * 插入排序1
     */

    public static void sortArr3(int[] arr) {
        int temp = 0;
        for (int i =1;i<arr.length;i++) {
           // 开始插入时,第一个数假定已经有序,从第二个数开始向后为无序,每次将无序中第一个数插入到有序中;
           for (int j=i; j>0;j--) {
               if (arr[j]<arr[j-1]) {
                   temp = arr[j];
                   arr[j] = arr[j-1];
                   arr[j-1] = temp;
               }
           }
        }
    }

    /**
     * 插入排序(优化)
     */

    public static void sortArr4(int[] arr) {
        for (int i = 1; i<arr.length; i++) {
            int insertVal = arr[i];  // 将要插入的元素取出,然后和它前面的元素挨个比较
            int insertIndex = i - 1; // 要插入元素的前一个的下标
            while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
                arr[insertIndex + 1] = arr[insertIndex];    // 如果insertVal小于它前面的元素,将前面的元素后移
                insertIndex--;    // 前移,指向前一个位置
            }
            // 等于i时相当于没又动
            if (insertIndex + 1 != i ) {
                arr[insertIndex + 1] = insertVal;  // 比较完成之后,将要插入的元素,插入位置
            }
        }
    }

 

posted @ 2020-03-22 17:12  撑起一片阳光  阅读(225)  评论(0编辑  收藏  举报