幾個常用排序算法(Java)

1、冒泡排序

  顧名思義,就像水裏的冒泡一樣,從小往上浮越來越大

1.比較相鄰2個元素,大於後者交換他們的位置。得出最大的元素放置在集合最後
2.持續對剩下的元素進行1的操作。

public static void bubbleSort(int[] numbers)
    {
        int temp = 0;
        int size = numbers.length;
        for(int i = 0 ; i < size-1; i ++)
        {
            for(int j = 0 ;j < size-1-i ; j++)
            {
                if(numbers[j] > numbers[j+1])  //交換
                {
                    temp = numbers[j];
                    numbers[j] = numbers[j+1];
                    numbers[j+1] = temp;
                }
            }

        }
    }

 

2、選擇排序

1.在未排序序列中找到最小元素,存放到排序序列的起始位置
2.再從剩餘未排序元素中繼續尋找最小元素,然後放到排序序列起始位置。
3.以此類推,直到所有元素均排序完畢。

    public static void selectSort(int[] numbers) {
        int size = numbers.length;
        int temp;
        //從零開始向後遍歷集合
        for (int i = 0; i < size; i++) {
            //將 i 賦值給k
            int k = i;
            //從集合最後一位開始向前遍歷
            for (int j = size - 1; j>i; j--)  {
                //記錄比較之後值小的位置
                if (numbers[j] < numbers[k]) {
                    k = j;
                }
            }
            // 將找出最小值與i位置的值交互,把最小值放置在集合最前
            temp = numbers[i];
            numbers[i] = numbers[k];
            numbers[k] = temp;

        }
    }

 

3、插入排序

1.從第一個元素開始,該元素可以認爲已經被排序;
2.取出下一個元素,在已經排序的元素序列中從後向前掃描;
3.如果該元素(已排序)大於新元素,將該元素移到下一位置;
4.重複步驟3,直到找到已排序的元素小於或者等於新元素的位置;
5.將新元素插入到該位置後;
6.重複步驟2~5。

private static void insertSort(int[] numbers) {
        //從1開始遞增的遍歷數據
        for (int i = 1; i < numbers.length; i++) {
            // 將 i 對應的值 賦予給 temp
            int temp = numbers[i];
            int j;
            // 從 i-1 開始遞減的遍歷
            for (j = i - 1; j >= 0; j--) {
                //判斷temp 是否小於當前j位置的值
                if (temp < numbers[j]) {
                    numbers[j + 1] = numbers[j];
                } else {
                    break;
                }
            }
            numbers[j + 1] = temp;
        }
    }

 

4、快速排序

1.從數列中挑出一個元素,稱爲 “基準”(pivot);
2.重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一 邊)。在這  個分區退出之後,該基準就處於數列的中間位置。這個稱爲分區(partition)操作;
3.遞歸,把小於基準值元素的子數列和大於基準值元素的子數列排序。

public static void quickSort(int[] arr,int low, int high) {
        if(low<high) {
            int partition = partition(arr,low,high);
            System.out.println("partition : "+partition+"  low : "+low+"  high : "+high+"  arr : "+Arrays.toString(arr));
            quickSort(arr,low, partition-1);
            quickSort(arr,partition+1, high);
        }
    }
    public static int partition(int[] arr,int low,int high) {
        int base = arr[low]; //用子表的第一個記錄做樞軸(分水嶺)記錄
        System.out.println("base : "+base);
        while(low<high) {
            while(arr[high]>=base&&low<high){
                high--;
            }
            Swap(arr,high,low);
            System.out.println("[high:"+high+"] "+Arrays.toString(arr));
            while(arr[low]<=base&&low<high) {
                low++;
            }
            Swap(arr,high,low);
        }
        return low;
    }
    public static void Swap(int[] arr,int high,int low) {
        int temp = arr[low];
        arr[low] =arr[high];
        arr[high] = temp;
    }



 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章