Java数据结构与算法(二)--简单排序

目录

为了对大量的数据进行检索,需要对数据进行排序,就像上章讲的,二分查找要快于迭代查找。

由于排序非常耗时且十分重要,它已经成为计算机中相当重要的课题。

这章将要讲三个时间复杂度都为O(N2)的简单排序:冒泡排序/选择排序/插入排序

1.冒泡排序                                                                      

冒泡排序就像水中的泡泡从水底升上来,不断变大一样。

每次排序将最大的数据冒上来(两两比较,将大的交换到后面或前面),最大的数设为已排,再去不断排序未排序的序列

排序过程可以参考下图:

代码如下:

/**
 * 冒泡排序
 */
public class BubbleSort {

    public static int[] sort(int[] arr){
        int len = arr.length;
        int temp;
        for (int i = 1; i < len; i++) {
            boolean flag = false;
            for (int j = 0; j < len-i; j++) {
                if(arr[j]>arr[j+1]){
                    temp = arr[j+1];
                    arr[j+1]= arr[j];
                    arr[j]=temp;
                    flag = true;
                }
            }
            //可能存在没到最后一轮就已经排序完的情况
            //设置一个标识,当该轮没有交换的时候表示排序结束
            if(!flag)break;
            //看下每轮排序后的排序情况
            System.out.println("第"+i+"轮排序后,排序结果:");
            display(arr);

        }
        return arr;
    }
    
    public static void display(int[] arr){
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]+" ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        int[] arr = {3,4,7,5,1,2,9,6,8};
        System.out.println("初始数据:");
        display(arr);
        System.out.println("-----------------------------------------");
        arr = sort(arr);
        System.out.println("-----------------------------------------");
        System.out.println("排序完成结果:");
        display(arr);
    }
    
}

 

运行情况:

1.选择排序                                                                      

上个冒泡排序可以发现,每轮排序的时候都要不停的交换数据使最大的数”冒“上来。

选择排序优化了交换次数,每次找到将待排数据的最小,将它放到最前面,即为最小数与最前面数据的交换,只需移动数据即可

排序过程参考下图:

代码如下:

 

/**
 * 选择排序
 */
public class ChoiceSort {

    public static int[] sort(int[] arr){
        int len = arr.length;
        int min = 0;//每轮找到的最小值
        int temp;
        for (int i = 0; i < len-1; i++) {
            //将最小值放在最前面,前面数据不断有序
            //未排数据范围不断缩小
            for (int j = i+1; j < len; j++) {
                if(arr[j]<arr[min]){
                    min = j;
                }
            }

            //将找到的最小值与队列最前面比较
            if(arr[min]<arr[i]){
                temp = arr[i];
                arr[i] =arr[min];
                arr[min]=temp;
            }

            //看下每轮排序后的排序情况
            System.out.println("第"+i+"轮排序后,排序结果:");
            display(arr);
        }
        return arr;
    }

    public static void display(int[] arr){
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]+" ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        int[] arr = {3,4,7,5,1,2,9,6,8};
        System.out.println("初始数据:");
        display(arr);
        System.out.println("-----------------------------------------");
        arr = sort(arr);
        System.out.println("-----------------------------------------");
        System.out.println("排序完成结果:");
        display(arr);
    }
}

 

 

 

运行情况:

1.插入排序                                                                      

接下来将要讲我觉得基本排序中最重要的插入排序,它也是快排等高级排序在数据量不大时采用的排序方式

它的思想就是,从待排序列取数,不断插入已排数据的方式

排序过程参考下图:

代码如下:

/**
 * 插入排序
 */
public class InsertSort {

    public static int[] sort(int[] arr){
        int len = arr.length;
        for (int i = 0; i < len-1; i++) {
            //第1个数据默认有序,从后面开始排序
            int j = i+1;
            //待排数据插入有序序列时,待排数据是一个不断前移的过程
            //可以直接获取待排序列,将有序序列后移,达到边界条件时:j=0 或 待排数据大于等于前面的数据
            //将待排数据插入该位置
            int temp = arr[j];
            while(j>0 && temp<arr[j-1]){//未达到边界条件,不断后移,腾出待排数据的位置
                arr[j]=arr[--j];
            }
            arr[j]=temp;

            //看下每轮排序后的排序情况
            System.out.println("第"+(i+1)+"轮排序后,排序结果:");
            display(arr);
        }
        return arr;
    }

    public static void display(int[] arr){
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]+" ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        int[] arr = {3,4,7,5,1,2,9,6,8};
        System.out.println("初始数据:");
        display(arr);
        System.out.println("-----------------------------------------");
        arr = sort(arr);
        System.out.println("-----------------------------------------");
        System.out.println("排序完成结果:");
        display(arr);
    }
}

 

运行情况:

4.总结                                                                        

虽然上述算法的时间复杂度都为O(N2)但某些情况,某些算法会优于某些算法

冒泡排序最简单但一般情况不采用

插入排序是应用到最多的排序方法

接下来我们会讲到一些高级算法,将介绍一些时间复杂度小于O(N2)的算法

 

 

 

 

 

 

 

 

  

posted @ 2020-08-23 11:54  潜水的cc  阅读(97)  评论(0)    收藏  举报