java 实现排序的几种方式
[*]冒泡排序(Bubble Sort)
[*]基本原理:
[*]它重复地走访要排序的数列,一次比力两个元素,如果它们的次序错误就把它们互换过来。走访数列的工作是重复地进行直到没有再必要互换,也就是说该数列已经排序完成。
[*]示例代码如下:
登录后复制 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 > arr) {
// 交换元素
int temp = arr;
arr = arr;
arr = temp;
}
}
}
}
public static void main(String[] args) {
int[] arr = {5, 4, 3, 2, 1};
System.out.println("Before sorting:");
for (int num : arr) {
System.out.print(num + " ");
}
System.out.println();
bubbleSort(arr);
System.out.println("After sorting:");
for (int num : arr) {
System.out.print(num + " ");
}
}
}
[*]1.
[*]2.
[*]3.
[*]4.
[*]5.
[*]6.
[*]7.
[*]8.
[*]9.
[*]10.
[*]11.
[*]12.
[*]13.
[*]14.
[*]15.
[*]16.
[*]17.
[*]18.
[*]19.
[*]20.
[*]21.
[*]22.
[*]23.
[*]24.
[*]25.
[*]26.
[*]27.
[*]28.
[*]时间复杂度:
[*]最好情况(数组已经有序):时间复杂度为,因为只必要进行一次遍历比力,没有互换操纵。
[*]最坏情况(数组完全逆序):时间复杂度为,因为每次遍历都要进行互换操纵,统共必要进行大约次比力。
[*]平均情况:时间复杂度为。
[*]空间复杂度:
[*]空间复杂度为,因为只必要有限的额外空间来进行元素互换。
[*]选择排序(Selection Sort)
[*]基本原理:
[*]首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末了。以此类推,直到全部元素均排序完毕。
[*]示例代码如下:
登录后复制 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 < arr) {
minIndex = j;
}
}
// 交换元素
if (minIndex!= i) {
int temp = arr;
arr = arr;
arr = temp;
}
}
}
public static void main(String[] args) {
int[] arr = {5, 4, 3, 2, 1};
System.out.println("Before sorting:");
for (int num : arr) {
System.out.print(num + " ");
}
System.out.println();
selectionSort(arr);
System.out.println("After sorting:");
for (int num : arr) {
System.out.print(num + " ");
}
}
}
[*]1.
[*]2.
[*]3.
[*]4.
[*]5.
[*]6.
[*]7.
[*]8.
[*]9.
[*]10.
[*]11.
[*]12.
[*]13.
[*]14.
[*]15.
[*]16.
[*]17.
[*]18.
[*]19.
[*]20.
[*]21.
[*]22.
[*]23.
[*]24.
[*]25.
[*]26.
[*]27.
[*]28.
[*]29.
[*]30.
[*]31.
[*]32.
[*]时间复杂度:
[*]最好情况、最坏情况宁静均情况的时间复杂度都是。因为无论数组初始状态怎样,都必要进行次比力操纵来确定元素的位置。
[*]空间复杂度:
[*]空间复杂度为,因为它只必要有限的额外空间来互换元素。
[*]插入排序(Insertion Sort)
[*]基本原理:
[*]它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常接纳 in - place 排序(即只需用到的额外空间的排序),因而在从后向前扫描过程中,必要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
[*]示例代码如下:
登录后复制 public class InsertionSort {
public static void insertionSort(int[] arr) {
int n = arr.length;
for (int i = 1; i < n; i++) {
int key = arr;
int j = i - 1;
while (j >= 0 && arr > key) {
arr = arr;
j = j - 1;
}
arr = key;
}
}
public static void main(String[] args) {
int[] arr = {5, 4, 3, 2, 1};
System.out.println("Before sorting:");
for (int num : arr) {
System.out.print(num + " ");
}
System.out.println();
insertionSort(arr);
System.out.println("After sorting:");
for (int num : arr) {
System.out.print(num + " ");
}
}
}
[*]1.
[*]2.
[*]3.
[*]4.
[*]5.
[*]6.
[*]7.
[*]8.
[*]9.
[*]10.
[*]11.
[*]12.
[*]13.
[*]14.
[*]15.
[*]16.
[*]17.
[*]18.
[*]19.
[*]20.
[*]21.
[*]22.
[*]23.
[*]24.
[*]25.
[*]26.
[*]27.
[*]时间复杂度:
[*]最好情况(数组已经有序):时间复杂度为,因为只必要进行次比力操纵,没有移动元素的操纵。
[*]最坏情况(数组完全逆序):时间复杂度为,因为每次插入一个元素都必要移动大量元素。
[*]平均情况:时间复杂度为。
[*]空间复杂度:
[*]空间复杂度为,因为插入排序是一种原地排序算法,只必要有限的额外空间来进行元素的移动和插入。
[*]快速排序(Quick Sort)
[*]基本原理:
[*]它接纳了分治法(Divide - and - Conquer)的策略。从数列中挑出一个元素,称为 “基准”(pivot),重新排序数列,全部元素比基准小的摆放在基准前面,全部元素比基准大的摆放在基准背面(雷同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个过程称为分区(partition)操纵。递归地把小于基准值元素的子数列和大于基准值元素的子数列排序。
[*]示例代码如下:
登录后复制 public class QuickSort {
public static void quickSort(int[] arr, int low, int high) {
if (low < high) {
int pivotIndex = partition(arr, low, high);
quickSort(arr, low, pivotIndex - 1);
quickSort(arr, pivotIndex + 1, high);
}
}
private static int partition(int[] arr, int low, int high) {
int pivot = arr;
int i = low - 1;
for (int j = low; j < high; j++) {
if (arr <= pivot) {
i++;
// 交换元素
int temp = arr;
arr = arr;
arr = temp;
}
}
// 交换元素
int temp = arr;
arr = arr;
arr = temp;
return i + 1;
}
public static void main(String[] args) {
int[] arr = {5, 4, 3, 2, 1};
System.out.println("Before sorting:");
for (int num : arr) {
System.out.print(num + " ");
}
System.out.println();
quickSort(arr, 0, arr.length - 1);
System.out.println("After sorting:");
for (int num : arr) {
System.out.print(num + " ");
}
}
}
[*]1.
[*]2.
[*]3.
[*]4.
[*]5.
[*]6.
[*]7.
[*]8.
[*]9.
[*]10.
[*]11.
[*]12.
[*]13.
[*]14.
[*]15.
[*]16.
[*]17.
[*]18.
[*]19.
[*]20.
[*]21.
[*]22.
[*]23.
[*]24.
[*]25.
[*]26.
[*]27.
[*]28.
[*]29.
[*]30.
[*]31.
[*]32.
[*]33.
[*]34.
[*]35.
[*]36.
[*]37.
[*]38.
[*]39.
[*]40.
[*]时间复杂度:
[*]最好情况:时间复杂度为,当每次分别都能将数组分为两个大小相近的子数组时,递归树的深度为,每层的时间复杂度为。
[*]最坏情况:时间复杂度为,比方数组已经有序,每次分别只能得到一个比上一次分别少一个元素的子数组。
[*]平均情况:时间复杂度为。
[*]空间复杂度:
[*]最好情况:空间复杂度为,因为递归栈的深度为。
[*]最坏情况:空间复杂度为,比方数组已经有序,递归栈必要存储个元素。
[*]平均情况:空间复杂度为。
[*]归并排序(Merge Sort)
[*]基本原理:
[*]它是创建在归并操纵上的一种有效的排序算法。该算法是接纳分治法(Divide - and - Conquer)的一个非常典型的应用。将已有序的子序列归并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表归并成一个有序表,称为二路归并。
[*]示例代码如下:
登录后复制 public class MergeSort {
public static void mergeSort(int[] arr) {
if (arr.length > 1) {
int mid = arr.length / 2;
int[] left = new int;
int[] right;
if (arr.length % 2 == 0) {
right = new int;
} else {
right = new int;
}
for (int i = 0; i < mid; i++) {
left = arr;
}
for (int i = mid; i < arr.length; i++) {
right = arr;
}
mergeSort(left);
mergeSort(right);
merge(arr, left, right);
}
}
private static void merge(int[] result, int[] left, int[] right) {
int i = 0, j = 0, k = 0;
while (i < left.length && j < right.length) {
if (left < right) {
result = left;
i++;
} else {
result = right;
j++;
}
k++;
}
while (i < left.length) {
result = left;
i++;
k++;
}
while (j < right.length) {
result = right;
j++;
k++;
}
}
public static void main(String[] args) {
int[] arr = {5, 4, 3, 2, 1};
System.out.println("Before sorting:");
for (int num : arr) {
System.out.print(num + " ");
}
System.out.println();
mergeSort(arr);
System.out.println("After sorting:");
for (int num : arr) {
System.out.print(num + " ");
}
}
}
[*]1.
[*]2.
[*]3.
[*]4.
[*]5.
[*]6.
[*]7.
[*]8.
[*]9.
[*]10.
[*]11.
[*]12.
[*]13.
[*]14.
[*]15.
[*]16.
[*]17.
[*]18.
[*]19.
[*]20.
[*]21.
[*]22.
[*]23.
[*]24.
[*]25.
[*]26.
[*]27.
[*]28.
[*]29.
[*]30.
[*]31.
[*]32.
[*]33.
[*]34.
[*]35.
[*]36.
[*]37.
[*]38.
[*]39.
[*]40.
[*]41.
[*]42.
[*]43.
[*]44.
[*]45.
[*]46.
[*]47.
[*]48.
[*]49.
[*]50.
[*]51.
[*]52.
[*]53.
[*]54.
[*]55.
[*]56.
[*]57.
[*]58.
[*]59.
[*]时间复杂度:
[*]最好情况、最坏情况宁静均情况的时间复杂度都是。因为归并排序每次分别都将数组分为两个子数组,统共必要分别层,每层归并操纵的时间复杂度为。
[*]空间复杂度:
[*]空间复杂度为,因为在归并过程中必要创建额外的数组来存储左右子数组。
[*]堆排序(Heap Sort)
[*]基本原理:
[*]堆排序是使用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满意堆积的性子:即子结点的键值或索引总是小于(或者大于)它的父节点。将数组构建成最大堆(对于升序排序),然后每次将堆顶元素(最大值)与堆的最后一个元素互换,再对剩下的堆进行调解,使其重新满意最大堆的性子,重复这个过程直到整个数组排序完成。
[*]示例代码如下:
登录后复制 public class HeapSort {
public static 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;
arr = arr;
arr = temp;
// 调整堆
heapify(arr, i, 0);
}
}
private static 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 > arr) {
largest = l;
}
if (r < n && arr > arr) {
largest = r;
}
if (largest!= i) {
int temp = arr;
arr = arr;
arr = temp;
heapify(arr, n, largest);
}
}
public static void main(String[] args) {
int[] arr = {5, 4, 3, 2, 1};
System.out.println("Before sorting:");
for (int num : arr) {
System.out.print(num + " ");
}
System.out.println();
heapSort(arr);
System.out.println("After sorting:");
for (int num : arr) {
System.out.print(num + " ");
}
}
}
[*]1.
[*]2.
[*]3.
[*]4.
[*]5.
[*]6.
[*]7.
[*]8.
[*]9.
[*]10.
[*]11.
[*]12.
[*]13.
[*]14.
[*]15.
[*]16.
[*]17.
[*]18.
[*]19.
[*]20.
[*]21.
[*]22.
[*]23.
[*]24.
[*]25.
[*]26.
[*]27.
[*]28.
[*]29.
[*]30.
[*]31.
[*]32.
[*]33.
[*]34.
[*]35.
[*]36.
[*]37.
[*]38.
[*]39.
[*]40.
[*]41.
[*]42.
[*]43.
[*]44.
[*]45.
[*]46.
[*]47.
[*]时间复杂度:
[*]最好情况、最坏情况宁静均情况的时间复杂度都是。构建堆的时间复杂度为,每次调解堆的时间复杂度为,统共必要进行次调解。
[*]空间复杂度:
[*]空间复杂度为,因为堆排序是一种原地排序算法,只必要有限的额外空间来互换元素。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]