排序上篇(选择排序,冒泡排序,插入排序,希尔排序)

1.选择排序

(1)原理:

 在要排序的一组数中,用第一个数与后面的数依次进行判断,若大于后面的则进行交换;然后依次再用第二个数与后面的数进行交换,如此循环到倒数第二个数和最后一个数比较为止。

2图解

内层第一次循环如下:

 

外层控制循环次数:

  1. 代码

  public static void selectSort(int[] arr) {

        for (int i = 0; i < arr.length - 1; i++) {   //使用嵌套循环,注意循环次数为数组长度减1

            for (int j = i + 1; j < arr.length; j++) {

                if (arr[i] > arr[j]) {

                    int temp = arr[i];

                    arr[i] = arr[j];

                    arr[j] = temp;

                }

            }

       

        }

    }

2.冒泡排序

(1)原理:

 在要排序的一组数中,从头开始用相邻的两个数依次进行比较,若第一个数大则调换位置,就这样让较大的数往下沉,较小的往上冒。如此循环到倒数第二个数和最后一个数比较为止。

2图解

 

3代码

public static void bubbleSort(int[] arr){

        for (int i = 0; i < arr.length-1; i++) {  //外层循环确定循环次数:数组长度减1

            for (int j = 0; j < arr.length-1-i; j++) {//内层循环比较相邻的元素,注意循环长度随着确定个数递减

                if (arr[j] > arr[j + 1]) {

                    int tem = arr[j];

                    arr[j] = arr[j + 1];

                    arr[j + 1] = tem;

                }

            }

        }

 

}

 

3.插入排序

(1)原理:

在要排序的一组数中,先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止。

2图解下图黑色方框为排好序的,有下划线是需要进行排序的数字,箭头为插入的位置

3代码

 

 public  static void inserSort(int[] arr){

        for (int i = 1; i < arr.length; i++) {

            int j;

            int num=arr[i];

            for ( j=i;j>0&&arr[j-1]>num;j--){ 

                arr[j]=arr[j-1];

            }

            arr[j]=num;

        }

 

    }

4.希尔排序

(1)原理:

在要排序的一组数中,先将整个待排序的记录序列按某个增量d(n/2,n为要排序数的个数)分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。

  1. 图解

3代码

 public static void shellSort1(int[] arr) {

        int dk = arr.length/2;

        while( dk >= 1  ){

            ShellSort2(arr, dk);

            dk = dk/2;

        }

    }

    private static void ShellSort2(int[] a, int dk) {//类似插入排序,只是插入排序增量是1,这里增量是dk,把1换成dk就可以了

        for(int i=dk;i<a.length;i++){

            if(a[i]<a[i-dk]){

                int j;

                int x=a[i];//x为待插入元素

                a[i]=a[i-dk];

                for(j=i-dk;  j>=0 && x<a[j];j=j-dk){//通过循环,逐个后移一位找到要插入的位置。

                    a[j+dk]=a[j];

                }

                a[j+dk]=x;//插入

            }

                  }

 

    }

猜你喜欢

转载自blog.csdn.net/weixin_42500488/article/details/84070087