冒泡排序、快速排序、插入排序等

一:java冒泡排序

 

1:定义接口:Sorter

 


public interface Sorter{

   //list:待排序的数组

   public <T extends Comparable<T> > void sort(T[ ] list);

   public <T> void sort(T [] list,Comparator<T> compa); 

}


//创建一个排序的工具类

public class SorterUtils implements Sorter{

@Override  
public <T extends Comparable<T>> void sort(T[] list) {  
        boolean swapped = true;  
        for (int i = 1, len = list.length; i < len && swapped; ++i) {  
            swapped = false;  
            for (int j = 0; j < len - i; ++j) {  
                if (list[j].compareTo(list[j + 1]) > 0) {  
                    T temp = list[j];  
                    list[j] = list[j + 1];  
                    list[j + 1] = temp;  
                    swapped = true;  
                }  
            }  
        }  
    }  

@Override  
public <T> void sort(T[] list, Comparator<T> comp) {  
        boolean swapped = true;  
        for (int i = 1, len = list.length; i < len && swapped; ++i) {  
            swapped = false;  
            for (int j = 0; j < len - i; ++j) {  
                if (comp.compare(list[j], list[j + 1]) > 0) {  
                    T temp = list[j];  
                    list[j] = list[j + 1];  
                    list[j + 1] = temp;  
                    swapped = true;  
                }  
            }  
        }  
    }  
}

 

二、冒泡排序(java版本或者叫c语言版本)

  核心思想:拿前一个数跟后一个数做比较大小。寻找到插入位置,通过中间变量交换两个数。

public static void bubbleSort(int[] arr){
        int temp = 0;//临时变量用作交换
        boolean flag = false; // 标识变量,表示是否进行过交换
        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]){
                    flag = true;//表示进行了交换
                    temp = arr[j + 1];
                    arr[j + 1] = arr[j];
                    arr[j] = temp;
                }
            }
            //假如一轮下来都没有交换,则代表已经是有序的了,直接退出循环
            if (!flag){
                break;
            }else {//否则继续循环,同时要把flag重置为false,这个思想经常用到,要熟悉这个思维
                flag = false;
            }
        }
    }

 

 

 

 

三、插入排序

  核心思想:插入排序的主要思想是将一组数据分为有序的一组数据,和一组无序的数据。有序的数据就是指排序好大小的数据,比如第一次初始化数据,就是取第一个数据,作为有序数据的第一个数。第二或者第n-1个数据分别在第一组数据进行比较,得到插入位置,然后对插入位置后面的数据都统统进行向后移动一位下标,直到插入数据。

public static void insertSort(int[] arr){
        int insertVal;//用来临时存储当前值,因为后面代码后移的时候,当前值会被前面的值覆盖掉
        int insertIndex;//用来存放即arr[当前]的前面这个数的下标
        for (int i = 1; i < arr.length; i++) {//从一开始,一开始就把最左边的数,当成有序的了
            insertVal = arr[i];
            insertIndex = i -1;
            while (insertIndex >= 0 &&  insertVal < arr[insertIndex]){
                arr[insertIndex + 1] = arr[insertIndex];//整体往后移动一位
                insertIndex--;//减一是因为要跟上一个数组值比较
            }
            // 当退出while循环时,说明插入的位置找到, insertIndex + 1
            //这里我们判断是否需要赋值
            if (insertIndex + 1 != i){
                arr[insertIndex + 1] = insertVal;//因为前面多减了一次才退出循环,所以这里是insertIndex + 1
            }
        }
    }

 

 

 

 

四、快速排序

 核心思想:快速排序也叫快排。其实现原理主要是:将一组数据分为两组数据,但是这两组数据(比如:A、B),A的数据一定比B组数据小。然后分别进行控制low和high的下标进行递归,里面涉及两个while循环,一个是A组数据排序,一个是对B组数据进行排序。

public static void quicksort(int[] arr , int start , int end){

        //递归结束条件就是没有数要比较了,意思就是开始的的数等于结束的数就退出递归
        if (start < end){
            int mun = arr[start];//定义参照数,选择最左边的哪个数
            int low = start;//定义左边开始的指针,就是最左边的数
            int high = end;//定义右边开始的指针,就是最右边的数

            //当左边指针小于右边指针开始执行
            while (low < high){
                //当左边low指针小于右边high指针,并且 参照数小于等于右边比较数的时候交换
                //特别注意,是小于等于,不然加入有两个相同的数,循环会卡死!!!!
                while (low < high && mun <= arr[high]){
                    //当参照数小于右边比较数时,不用交换,所以指针前移
                    high--;
                }
                当参照数大于右边比较数时,跟左边指针指向的数交换
                arr[low] = arr[high];

                while (low < high && mun >= arr[low]){
                    //当参照数小于左边比较数时,不用交换,所以指针后移
                    low++;
                }
                //同理
                arr[high] = arr[low];
            }
            //此时,low和high其实都是一样的,当指针重叠时,就结束了此次排序,就把两个指针同时指向的数换成参照数
            //这样就实现了参照数左边都是小的数,右边都是大的数
            arr[low] = mun;
            //进行递归,但不用比较整个数组了,而是本次参照数的左边数组在进行递归比较,右边同理
            //所以左边开始的指针就是数组最左边,左边结束的指针就是本次两个指针重合的地方也就是low或者high
            //右边开始的指针是本次重叠指针的后一个位置,因为重叠指针仔左边会参与比较,结束位置就是数组的最右边
            quicksort(arr,start,low);
            quicksort(arr,low+1,end);
        }
    }

 

 

 

 

注意:资源来自于网上,本人验证算法没问题,分享出来给大伙

posted @ 2021-07-09 23:20  QH.Thomas  阅读(187)  评论(0编辑  收藏  举报