經典排序算法


冒泡排序

原理: 比較、交換

  • 相鄰元素進行比較,前一個大就交換兩元素,反之不做交換
  • 交換(或不交換)之後往後移動一位繼續比較之後的兩元素
  • 每完成一輪比較找出最大的元素被排在了最後,因此一共需要比較n-1次
  • 下一輪比較的時候可以少比較一個
//冒泡排序

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.next();
        char[] a = s.toCharArray();
        char temp;

        for (int i = 0; i < a.length-1; i++) {
            for (int j = 0; j < a.length-1-i; j++) { 
                if (a[j] > a[j+1]) {
                    temp = a[j+1];
                    a[j+1] = a[j];
                    a[j] = temp;
                }
            }
        }
        System.out.println(a);
    }
}

時間複雜度

  • 若初始序列爲“正序”序列,則只需要進行1趟排序。在排序過程中進行n-1次關鍵字之間的比較,且不移動記錄;反之若初始序列爲“逆序”序列,則將需要n-1趟的排序,需要進行n(n-1)/2次的比較,並做等數量級的交換操作,因此總的時間 複雜度爲O(nn)。

選擇排序

原理:選擇最小(大)、交換

  • 1、先在沒有排序的序列中找出最小(或者最大)的元素
  • 2、與無需序列最前面的元素交換(即放在無序列的最前面,有序序列的最後面),此時無需序列元素數量減一,有序序列加一
  • 3、再從這個無需序列中找出最小(或者最大)元素,重複2,重複這個循環
  • 需要進行n-1趟
//選擇排序

import java.util.Scanner;
public class SelectionSort {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.next();
        char[] a = s.toCharArray();
        char temp;
        int minIndex;

        for (int i = 0; i < a.length-1; i++) {
            minIndex = i;
            for (int j = i+1; j < a.length; j++) {
                if (a[j] < a[minIndex]) {
                    minIndex = j;
                }
            }
            if (i != minIndex) {
                temp = a[i];
                a[i] = a[minIndex];
                a[minIndex] = temp;
            }
        }
        System.out.println(a);
    }
}

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