Loading

Java——排序

关于排序我想大家都不陌生,所谓排序就是将输入的数字按照从小到大的顺序进行排列。当然排序也是多种多样的,接下来我们来一次看看各种排序:

 

插入排序(挖坑)

堆排序(挖坑)

归并排序(挖坑)

============================================================================

冒泡排序

首先我们从冒泡排序开始说吧(取自于算法动画图解)

先以这9个数为基础,从序列右边开始比较相邻两个数字的大小,这里就是比较7和6的大小,因为7>6,所以他们交换位置。结果如下图:

之后,天平向前移动,开始比较4和6,因为4<6,所以位置不变;天平在往前移,开始比较4和8,因为8>4,所以交换位置...........以此类推直到第一轮循环结束;

通过第一轮循环,把最小值排到了第一位,之后第二轮循环开始,天平重新从序列右边开始;

重复上述的过程......

不难看出第一轮需要比较n-1次,第二轮需要比较n-2次.........第n-1轮需要比较1次。因此,比较次数为(n-1)+(n-2)+......+1约为n^2/2。

时间复杂度为n^2;

代码实现如下:

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int[] intarray;
        System.out.println("请输入数组的大小");
        int n = scanner.nextInt();
        intarray = new int [n];
        System.out.println("请输入"+intarray.length+"个数字");
        for(int i=0;i<intarray.length;i++) {
            intarray[i] = scanner.nextInt();
        }
        scanner.close();
        for(int i=0;i<intarray.length-1;i++) {
            for(int j=0;j<intarray.length-i-1;j++) {
                if(intarray[j]>intarray[j+1]) {
                    int t=intarray[j];
                    intarray[j]=intarray[j+1];
                    intarray[j+1]=t;
                }
            }
        }
        System.out.println("冒泡排序的结果为");
        for(int i=0;i<intarray.length;i++) {
            System.out.print(intarray[i]+" ");
        }
    }

选择排序

所谓选择排序就是重复“从待排序的数据中寻找最小值,将其与序列最左边的数字进行交换”,找最大值也可以。

以下述为例:

从中寻找最小的数——1,然后把‘1’放到最左边;

在从为排序的区域选择最小值.......以此类推;

第一轮找最小值需要比较(n-1)个数字,第二轮找最小值需要比较(n-2)个数字........第n-1轮找最小值只需找一个数字,和冒泡排序相同都是:(n-1)+(n-2)+......+1约为n^2/2。

时间复杂度也为n^2;

代码实现如下:

public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int[] arrays;
        System.out.println("请输入数组的大小");
        int n = scanner.nextInt();
        arrays = new int [9];
        System.out.println("请输入"+arrays.length+"个数字");
        for(int i=0;i<arrays.length;i++) {
            arrays[i] = scanner.nextInt();
        }
        scanner.close();
        selectsort(arrays);
        System.out.println("从小到大依次为");
        for(int i=0;i<arrays.length;i++) {
            System.out.print(arrays[i]+" ");
        }
    }
    
    public static void selectsort(int[] arrays) {
        for(int i=0;i<arrays.length;i++) {
            int min = i;
            for(int j=i;j<arrays.length;j++) {
                if(arrays[min]>arrays[j]) {
                    min=j;
                }
            }
            if(min!=i) {
                int t = arrays[i];
                arrays[i] = arrays[min];
                arrays[min] = t;
            }
        }
    }

快速排序

快速排序会在序列之中随机选择一个基准值(pivot),然后将基准值以外的数,分为“比基准值大的数”和“比基准值小的数”两部分。

[比基准值小的数] 基准值 [比基准值大的数]

接着对两个“[]”中的数据进行排序,对"[]"里面的数据也是同样的方法。

以下图为例:

以数组最后的值为基准值,然后开始比较如果leftpivot小则往后移动;

直到碰到的数字比pivot大看right

 

开始比较rightpivot,如果right>pivot则向前移动,直到遇到比pivot小的数。

 

之后交换leftright的位置,

 

之后再开始移动left,如果left<pivot则向后移动,直到遇到right停止。(注意先移动left)

 

交换left(right)pivot的位置,之后这个数组将会被分割,这时从前面的“[]”开始循环上述的步骤;

 

如果left<pivot则往后移,right>pivot则前移,反之则交换位置;

交换完后:

 

这里pivot为最大值,所以left在遇到right时不会停止移动(这里与right不同),而是接着向后移动直到与pivot相遇,所以该操作并不需要移动。

 

这里因为left>pivot,所以锁定,rightleft碰撞,之后和pivot交换位置。以此类推;

到最后一个“[]”;

根据上述操作排序即可。

 

 

posted @ 2019-10-17 12:29  数学天才琪露诺  阅读(162)  评论(0编辑  收藏  举报