ソート-バブルソート-マージソート-クイックソート-挿入ソートを選択します

並べ替えを選択

  • 基本的な考え方:
    ソートされたシーケンスの数をNとすると、iは1、2、3 ... n-1をとり、N-i + 1レコード(Ri、Ri + 1 .... Rn)から最小のソートコードを持つレコードを見つけます。 、i番目のレコードと交換し、N-1回実行した後にシーケンスの並べ替えを完了します。
//选择排序
private static void selectSort(int[] arr, int n) {
    for (int i = 0; i < n - 1; ++i) {
        for (int j = i + 1; j < n; ++j) {
            if (arr[i] > arr[j]) {
                int t = arr[i];
                arr[i] = arr[j];
                arr[j] = t;
            }
        }
    }
}

バブルソート

  • 基本的な考え方:
    隣接する要素をペアで比較し、逆の順序で交換します。毎回、最大または最小の要素が「浮き上がり」、最終的に順番に到達します。
//冒泡排序
private static void bubbleSort(in[] arr, into n) {
    for (int i = 0; i < n - 1; ++i) {
        for (int j = 0; j < n - 1 - i; ++j) {
            if (arr[j] > arr[j + 1]) {
                int t = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = t;
            }
        }
    }
}

マージソート

  • 並べ替えられるレコードがすべて順序付けられたシーケンスになるまで、いくつかの順序付けられたシーケンスをペアで組み合わせます。
//归并排序
private static void mergeSort(int[] arr, int n) {
    mergeSort(arr, 0, n - 1);
}

private static void mergeSort(int[] arr, int low, int high) {
    if (low < high) {
        int mid = (low + high) / 2;
        // 左边
        mergeSort(arr, low, mid);
        // 右边
        mergeSort(arr, mid + 1, high);
        // 左右归并
        merge(arr, low, mid, high);
    }
}

private static void merge(int[] arr, int low, int mid, int high) {
    int[] temp = new int[high - low + 1];
    int i = low;// 左指针
    int j = mid + 1;// 右指针
    int k = 0;
    // 把较小的数先移到新数组中
    while (i <= mid && j <= high) {
        if (arr[i] < arr[j]) {
            temp[k++] = arr[i++];
        } else {
            temp[k++] = arr[j++];
        }
    }
    // 把左边剩余的数移入数组
    while (i <= mid) {
        temp[k++] = arr[i++];
    }
    // 把右边边剩余的数移入数组
    while (j <= high) {
        temp[k++] = arr[j++];
    }
    // 把新数组中的数覆盖arr数组
    for (int k2 = 0; k2 < temp.length; k2++) {
        arr[k2 + low] = temp[k2];
    }
}

クイックソート

  • 基本的な考え方:
    ソートするデータをワンパスソートによって2つの独立した部分に分割し、1つの部分のすべてのデータが他の部分のすべてのデータよりも小さい場合、この方法に従って2つの部分をすばやくソートします
//快速排序
private static void quickSoft(int arr[], int length) {
    quickSoft(arr, 0, length - 1);
}

private static void quickSoft(int arr[], int low, int high) {
    int pos;
    if (low < high) {
        pos = partition(arr, low, high);
        quickSoft(arr, low, pos - 1);
        quickSoft(arr, pos + 1, high);
    }
}

private static int partition(int[] arr, int low, int high) {
    int val = arr[low];
    while (low < high) {
        while (low < high && arr[high] >= val) {
            --high;
        }
        arr[low] = arr[high];
        while (low < high && arr[low] <= val) {
            ++low;
        }
        arr[high] = arr[low];
    }
    arr[low] = val;
    return low;
}

ソートを挿入

  • 基本的な考え方:
    すべてのレコードがソートされるまで、ソートされるレコードがキーコードのサイズに従って順序付けされたシーケンスに挿入されるたび。
 //插入排序
private static void insertSoft(int[] arr, int n) {
    for (int i = 1; i < n; i++) {
        int t = arr[i];
        int k = i;
        for (int j = i - 1; j >= 0 && arr[j] > t; --j) {
            arr[j + 1] = arr[j];
            k = j;
        }
        arr[k] = t;
    }
}
395の元の記事を公開 130を獲得 200,000ビュー+

おすすめ

転載: blog.csdn.net/qq_40507857/article/details/86512570