java顺序排序法_顺序排序法有哪些

6ebda93b947187cda67cfa7a6174510a.png

在计算器科学与数学中,一个排序算法(英语:Sorting algorithm)是一种能将一串数据依照特定排序方式进行排列的一种算法。本文将总结几类常用的排序算法,包括冒泡排序、选择排序、插入排序、快速排序和归并排序。

1、冒泡排序

原理图

7837488ecf06e0b3d9e6585cc284bb89.png

理解:通过重复地遍历要排序的列表,比较每对相邻的项目,并在顺序错误的情况下交换它们。

代码:public class BubbleSort {

// logic to sort the elements

public static void bubble_srt(int array[]) { int n = array.length; int k; for (int m = n; m >= 0; m--) { for (int i = 0; i < n - 1; i++) {

k = i + 1; if (array[i] > array[k]) {

swapNumbers(i, k, array);

}

}

printNumbers(array);

}

}

private static void swapNumbers(int i, int j, int[] array) {

int temp;

temp = array[i]; array[i] = array[j]; array[j] = temp;

}

private static void printNumbers(int[] input) {

for (int i = 0; i < input.length; i++) {

System.out.print(input[i] + ", ");

}

System.out.println("\n");

}

public static void main(String[] args) { int[] input = { 4, 2, 9, 6, 23, 12, 34, 0, 1 };

bubble_srt(input);

}

}

2、选择排序

原理图

06e45771e21e1e9dc96b71123bbe9848.png

理解:内部循环查找下一个最小(或最大)值,外部循环将该值放入其适当的位置。

代码:public class SelectionSort {

public static int[] doSelectionSort(int[] arr){

for (int i = 0; i < arr.length - 1; i++)

{ int index = i; for (int j = i + 1; j < arr.length; j++) if (arr[j] < arr[index])

index = j;

int smallerNumber = arr[index];

arr[index] = arr[i];

arr[i] = smallerNumber;

} return arr;

}

public static void main(String a[]){

int[] arr1 = {10,34,2,56,7,67,88,42}; int[] arr2 = doSelectionSort(arr1); for(int i:arr2){

System.out.print(i);

System.out.print(", ");

}

}

}

3、插入排序

原理图

8d0aeb217f918166d47682904d6eb119.png

理解:每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有元素为止。

代码:public class InsertionSort {

public static void main(String a[]){ int[] arr1 = {10,34,2,56,7,67,88,42}; int[] arr2 = doInsertionSort(arr1); for(int i:arr2){

System.out.print(i);

System.out.print(", ");

}

}

public static int[] doInsertionSort(int[] input){

int temp; for (int i = 1; i < input.length; i++) { for(int j = i ; j > 0 ; j--){ if(input[j] < input[j-1]){

temp = input[j]; input[j] = input[j-1]; input[j-1] = temp;

}

}

} return input;

}

}

4、快速排序

原理图

d6c447c94ffa7af863d2ad6bee7d3b21.png

理解:将原问题分解为若干个规模更小,但结构与原问题相似的子问题,递归地解这些子问题,然后将这些子问题的解组合为原问题的解。

代码:public class QuickSort {

private int array[]; private int length;

public void sort(int[] inputArr) {

if (inputArr == null || inputArr.length == 0) { return;

} this.array = inputArr;

length = inputArr.length;

quickSort(0, length - 1);

}

private void quickSort(int lowerIndex, int higherIndex) {

int i = lowerIndex; int j = higherIndex; // calculate pivot number, I am taking pivot as middle index number

int pivot = array[lowerIndex+(higherIndex-lowerIndex)/2]; // Divide into two arrays

while (i <= j) { /**

* In each iteration, we will identify a number from left side which

* is greater then the pivot value, and also we will identify a number

* from right side which is less then the pivot value. Once the search

* is done, then we exchange both numbers.

*/

while (array[i] < pivot) {

i++;

} while (array[j] > pivot) {

j--;

} if (i <= j) {

exchangeNumbers(i, j); //move index to next position on both sides

i++;

j--;

}

} // call quickSort() method recursively

if (lowerIndex < j)

quickSort(lowerIndex, j); if (i < higherIndex)

quickSort(i, higherIndex);

}

private void exchangeNumbers(int i, int j) { int temp = array[i]; array[i] = array[j]; array[j] = temp;

}

public static void main(String a[]){

MyQuickSort sorter = new MyQuickSort(); int[] input = {24,2,45,20,56,75,2,56,99,53,12};

sorter.sort(input); for(int i:input){

System.out.print(i);

System.out.print(" ");

}

}

}

5、归并排序

原理图

6bf292150aed2f4d527d68754cd1dd83.png

理解:将待排序的数列分成若干个长度为1的子数列,然后将这些数列两两合并;得到若干个长度为2的有序数列,再将这些数列两两合并;得到若干个长度为4的有序数列,再将它们两两合并;直接合并成一个数列为止。

代码:public class MergeSort {

private int[] array; private int[] tempMergArr; private int length;

public static void main(String a[]){

int[] inputArr = {45,23,11,89,77,98,4,28,65,43};

MyMergeSort mms = new MyMergeSort();

mms.sort(inputArr); for(int i:inputArr){

System.out.print(i);

System.out.print(" ");

}

}

public void sort(int inputArr[]) { this.array = inputArr; this.length = inputArr.length; this.tempMergArr = new int[length];

doMergeSort(0, length - 1);

}

private void doMergeSort(int lowerIndex, int higherIndex) {

if (lowerIndex < higherIndex) { int middle = lowerIndex + (higherIndex - lowerIndex) / 2; // Below step sorts the left side of the array

doMergeSort(lowerIndex, middle); // Below step sorts the right side of the array

doMergeSort(middle + 1, higherIndex); // Now merge both sides

mergeParts(lowerIndex, middle, higherIndex);

}

}

private void mergeParts(int lowerIndex, int middle, int higherIndex) {

for (int i = lowerIndex; i <= higherIndex; i++) {

tempMergArr[i] = array[i];

} int i = lowerIndex; int j = middle + 1; int k = lowerIndex; while (i <= middle && j <= higherIndex) { if (tempMergArr[i] <= tempMergArr[j]) { array[k] = tempMergArr[i];

i++;

} else { array[k] = tempMergArr[j];

j++;

}

k++;

} while (i <= middle) { array[k] = tempMergArr[i];

k++;

i++;

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
快速排序(Quick Sort)是一种常用且高效的排序,它通过分治的思想将一个大问题分解为若干个小问题进行解决。在 Java 中,可以使用递归来实现快速排序。 下面是一个简单的 Java 实现示例: ```java public class QuickSort { public static void quickSort(int[] arr, int low, int high) { if (low < high) { int pivot = partition(arr, low, high); // 划分操作,获取基准元素的位置 quickSort(arr, low, pivot - 1); // 对基准元素左边的子数组进行快速排序 quickSort(arr, pivot + 1, high); // 对基准元素右边的子数组进行快速排序 } } public static int partition(int[] arr, int low, int high) { int pivot = arr[low]; // 选择第一个元素作为基准元素 while (low < high) { while (low < high && arr[high] >= pivot) { high--; } arr[low] = arr[high]; // 将比基准元素小的元素移到左边 while (low < high && arr[low] <= pivot) { low++; } arr[high] = arr[low]; // 将比基准元素大的元素移到右边 } arr[low] = pivot; // 将基准元素放入正确的位置 return low; // 返回基准元素的位置 } public static void main(String[] args) { int[] arr = {5, 2, 8, 9, 1, 3}; quickSort(arr, 0, arr.length - 1); System.out.println(Arrays.toString(arr)); } } ``` 以上代码中,`quickSort` 方用于实现快速排序,它首先通过 `partition` 方将数组划分为两个部分,左边的部分小于等于基准元素,右边的部分大于等于基准元素。然后递归地对子数组进行快速排序。`partition` 方选择第一个元素作为基准元素,通过双指针的方式将小于基准元素的元素移到左边,大于基准元素的元素移到右边,最后将基准元素放入正确的位置。 运行以上代码,输出结果为 `[1, 2, 3, 5, 8, 9]`,表示数组已经按照从小到大的顺序排序好了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值