赞
踩
选择排序是一种简单的排序算法,其基本思想是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放到序列的起始位置,直到全部待排序的数据元素排完。
具体实现步骤如下:
- public class SelectionSort {
- public static void selectionSort(int[] arr) {
- int n = arr.length;
- for (int i = 0; i < n - 1; i++) {
- int minIndex = i;
- for (int j = i + 1; j < n; j++) {
- if (arr[j] < arr[minIndex]) {
- minIndex = j;
- }
- }
- int temp = arr[i];
- arr[i] = arr[minIndex];
- arr[minIndex] = temp;
- }
- }
-
- public static void main(String[] args) {
- int[] arr = {64, 25, 12, 22, 11};
- selectionSort(arr);
- System.out.println("Sorted array:");
- for (int num : arr) {
- System.out.print(num + " ");
- }
- }
- }
冒泡排序是一种简单的排序算法,其基本思想是通过相邻元素之间的比较和交换,依次将待排序的元素“浮”到正确的位置。
具体实现步骤如下:
- public class BubbleSort {
- public static void bubbleSort(int[] arr) {
- int n = arr.length;
- for (int i = 0; i < n - 1; i++) {
- for (int j = 0; j < n - i - 1; j++) {
- if (arr[j] > arr[j + 1]) {
- // 交换arr[j]和arr[j+1]
- int temp = arr[j];
- arr[j] = arr[j + 1];
- arr[j + 1] = temp;
- }
- }
- }
- }
-
- public static void main(String[] args) {
- int[] arr = {64, 34, 25, 12, 22, 11, 90};
- bubbleSort(arr);
- System.out.println("Sorted array:");
- for (int num : arr) {
- System.out.print(num + " ");
- }
- }
- }
堆排序是一种树形选择排序,它利用堆这种数据结构进行排序。堆是一个近似完全二叉树的结构,并同时满足堆的性质:父节点的键值总是大于或等于(小于或等于)任何一个子节点的键值。
堆排序的基本思想如下:
- public class HeapSort {
- public void heapSort(int arr[]) {
- int n = arr.length;
-
- // 构建最大堆
- for (int i = n / 2 - 1; i >= 0; i--) {
- heapify(arr, n, i);
- }
-
- // 依次取出堆顶元素,调整堆
- for (int i = n - 1; i > 0; i--) {
- // 将堆顶元素与当前堆的最后一个元素交换
- int temp = arr[0];
- arr[0] = arr[i];
- arr[i] = temp;
-
- // 调整堆,重新构建最大堆
- heapify(arr, i, 0);
- }
- }
-
- void heapify(int arr[], int n, int i) {
- int largest = i;
- int l = 2 * i + 1;
- int r = 2 * i + 2;
-
- if (l < n && arr[l] > arr[largest]) {
- largest = l;
- }
-
- if (r < n && arr[r] > arr[largest]) {
- largest = r;
- }
-
- if (largest != i) {
- int swap = arr[i];
- arr[i] = arr[largest];
- arr[largest] = swap;
-
- heapify(arr, n, largest);
- }
- }
-
- public static void main(String args[]) {
- int arr[] = {12, 11, 13, 5, 6, 7};
- HeapSort ob = new HeapSort();
- ob.heapSort(arr);
- System.out.println("Sorted array is");
- for (int i : arr) {
- System.out.print(i + " ");
- }
- }
- }
插入排序是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对未排序的数据逐个插入到已排序的部分中,从而获得最终的排序结果。
具体实现步骤如下:
- public class InsertionSort {
- public void insertionSort(int arr[]) {
- int n = arr.length;
- for (int i = 1; i < n; i++) {
- int key = arr[i];
- int j = i - 1;
- while (j >= 0 && arr[j] > key) {
- arr[j + 1] = arr[j];
- j = j - 1;
- }
- arr[j + 1] = key;
- }
- }
-
- public static void main(String args[]) {
- int arr[] = {12, 11, 13, 5, 6};
- InsertionSort ob = new InsertionSort();
- ob.insertionSort(arr);
- System.out.println("Sorted array is");
- for (int i : arr) {
- System.out.print(i + " ");
- }
- }
- }
希尔排序是一种改进的插入排序算法,也称为“缩小增量排序”。它通过将原始序列分割成若干子序列进行插入排序,从而使得整个序列基本有序,最后再对整个序列进行一次插入排序。
具体实现步骤如下:
- public class ShellSort {
- public void shellSort(int arr[]) {
- int n = arr.length;
-
- // 选择希尔增量序列
- int gap = 1;
- while (gap < n / 3) {
- gap = gap * 3 + 1;
- }
-
- // 缩小增量,重复插入排序
- while (gap > 0) {
- for (int i = gap; i < n; i++) {
- int temp = arr[i];
- int j = i;
- while (j >= gap && arr[j - gap] > temp) {
- arr[j] = arr[j - gap];
- j -= gap;
- }
- arr[j] = temp;
- }
- gap = (gap - 1) / 3;
- }
- }
-
- public static void main(String args[]) {
- int arr[] = {12, 11, 13, 5, 6, 7};
- ShellSort ob = new ShellSort();
- ob.shellSort(arr);
- System.out.println("Sorted array is");
- for (int i : arr) {
- System.out.print(i + " ");
- }
- }
- }
希尔增量的选择可以影响算法性能,常用的希尔增量序列有Hibbard增量、Sedgewick增量等。
归并排序是一种基于分治思想的排序算法,它将原始序列分割成较小的子序列,然后不断地合并两个有序子序列,直到整个序列有序为止。
具体实现步骤如下:
- public class MergeSort {
- public void merge(int arr[], int l, int m, int r) {
- int n1 = m - l + 1;
- int n2 = r - m;
-
- int L[] = new int[n1];
- int R[] = new int[n2];
-
- for (int i = 0; i < n1; ++i) {
- L[i] = arr[l + i];
- }
- for (int j = 0; j < n2; ++j) {
- R[j] = arr[m + 1 + j];
- }
-
- int i = 0, j = 0;
- int k = l;
- while (i < n1 && j < n2) {
- if (L[i] <= R[j]) {
- arr[k] = L[i];
- i++;
- } else {
- arr[k] = R[j];
- j++;
- }
- k++;
- }
-
- while (i < n1) {
- arr[k] = L[i];
- i++;
- k++;
- }
-
- while (j < n2) {
- arr[k] = R[j];
- j++;
- k++;
- }
- }
-
- public void mergeSort(int arr[], int l, int r) {
- if (l < r) {
- int m = (l + r) / 2;
- mergeSort(arr, l, m);
- mergeSort(arr, m + 1, r);
- merge(arr, l, m, r);
- }
- }
-
- public static void main(String args[]) {
- int arr[] = {12, 11, 13, 5, 6, 7};
- MergeSort ob = new MergeSort();
- ob.mergeSort(arr, 0, arr.length - 1);
- System.out.println("Sorted array is");
- for (int i : arr) {
- System.out.print(i + " ");
- }
- }
- }
快速排序是一种常用的基于分治思想的排序算法,由C. A. R. Hoare在1960年提出。
快速排序的实现步骤如下:
- public class QuickSort {
- public int partition(int arr[], int low, int high) {
- int pivot = arr[high];
- int i = (low - 1);
- for (int j = low; j < high; j++) {
- if (arr[j] <= pivot) {
- i++;
-
- int temp = arr[i];
- arr[i] = arr[j];
- arr[j] = temp;
- }
- }
-
- int temp = arr[i + 1];
- arr[i + 1] = arr[high];
- arr[high] = temp;
-
- return i + 1;
- }
-
- public void quickSort(int arr[], int low, int high) {
- if (low < high) {
- int pi = partition(arr, low, high);
-
- quickSort(arr, low, pi - 1);
- quickSort(arr, pi + 1, high);
- }
- }
-
- public static void main(String args[]) {
- int arr[] = {12, 11, 13, 5, 6, 7};
- QuickSort ob = new QuickSort();
- ob.quickSort(arr, 0, arr.length - 1);
- System.out.println("Sorted array is");
- for (int i : arr) {
- System.out.print(i + " ");
- }
- }
- }
快速排序的时间复杂度为O(nlogn),并且通常具有更好的性能表现,适合各种数据规模的排序。它也是许多其他排序算法的基础,例如堆排序和归并排序。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。