使用java语言,编写排序算法中3至5个经典算法,在每个算法的代码中添加注释来解释每一步的作用,并再每个算法后补充其原理或思路,以及时间复杂度及其计算过程
时间: 2024-06-04 13:11:44 浏览: 83
1. 冒泡排序
/**
* 冒泡排序
* @param arr 待排序数组
* @return 排序后的数组
*/
public static int[] bubbleSort(int[] arr) {
int temp;
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j+1]) {
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
return arr;
}
// 原理或思路:每次比较相邻的两个元素,如果前一个元素大于后一个元素,则交换这两个元素的位置,一直重复这个过程,直到排序完成。
// 时间复杂度:O(n^2),计算过程:n*(n-1)/2。
2. 快速排序
/**
* 快速排序
* @param arr 待排序数组
* @param left 左边界
* @param right 右边界
* @return 排序后的数组
*/
public static int[] quickSort(int[] arr, int left, int right) {
if (left < right) {
int i = left, j = right, x = arr[left];
while (i < j) {
while (i < j && arr[j] >= x) {
j--;
}
if (i < j) {
arr[i++] = arr[j];
}
while (i < j && arr[i] < x) {
i++;
}
if (i < j) {
arr[j--] = arr[i];
}
}
arr[i] = x;
quickSort(arr, left, i - 1);
quickSort(arr, i + 1, right);
}
return arr;
}
// 原理或思路:选择一个基准元素,将小于基准元素的放到左边,大于基准元素的放到右边,然后分别对左右两个子序列进行递归排序。
// 时间复杂度:O(nlogn),计算过程:nlogn。
3. 插入排序
/**
* 插入排序
* @param arr 待排序数组
* @return 排序后的数组
*/
public static int[] insertionSort(int[] arr) {
int temp;
for (int i = 1; i < arr.length; i++) {
temp = arr[i];
int j;
for (j = i - 1; j >= 0 && arr[j] > temp; j--) {
arr[j+1] = arr[j];
}
arr[j+1] = temp;
}
return arr;
}
// 原理或思路:将待排序序列分为已排序和未排序两部分,从未排序序列中取出一个元素,插入到已排序序列中的合适位置。
// 时间复杂度:O(n^2),计算过程:n*(n-1)/2。
4. 选择排序
/**
* 选择排序
* @param arr 待排序数组
* @return 排序后的数组
*/
public static int[] selectionSort(int[] arr) {
int temp;
for (int i = 0; i < arr.length - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
return arr;
}
// 原理或思路:每次从未排序序列中选择一个最小元素,放到已排序序列的末尾。
// 时间复杂度:O(n^2),计算过程:n*(n-1)/2。
5. 希尔排序
/**
* 希尔排序
* @param arr 待排序数组
* @return 排序后的数组
*/
public static int[] shellSort(int[] arr) {
int n = arr.length;
for (int gap = n/2; gap > 0; gap /= 2) {
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;
}
}
return arr;
}
// 原理或思路:将待排序序列分为若干个子序列,对每个子序列进行插入排序,缩小子序列的间隔,重复上述过程,直到间隔为1,即进行一次插入排序。
// 时间复杂度:O(nlogn),计算过程:不好计算,取决于间隔序列的选取。
阅读全文