给定一组“无序”记录序列{25, 30, 11, 7, 22, 16, 18, 33, 40, 55},采用冒泡排序、堆排序将该序列排成非递减序列,完成以下问题: 1)写出冒泡排序、堆排序方法的Java实现代码。 2)写出冒泡排序第二趟排序后的结果。 4)画出采用堆排序方法第一次抽取堆顶元素后得到的最小堆。 7)比较上述2种排序算法的性能(时间复杂度)。
时间: 2023-03-20 07:03:24 浏览: 45
图论小作业:给定一个序列,判断其是否可图(python)
1) 冒泡排序和堆排序的Java实现代码如下:
冒泡排序:
```
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]) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
```
堆排序:
```
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[0];
arr[0] = arr[i];
arr[i] = temp;
heapify(arr, i, 0);
}
}
public 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[l] > arr[largest]) {
largest = l;
}
if (r < n && arr[r] > arr[largest]) {
largest = r;
}
if (largest != i) {
int temp = arr[i];
arr[i] = arr[largest];
arr[largest] = temp;
heapify(arr, n, largest);
}
}
```
2) 冒泡排序第二趟排序后的结果为:{11,25,7,22,16,18,30,33,40,55}
4) 采用堆排序方法第一次抽取堆顶元素后得到的最小堆如下:
```
7
/ \
25 11
```
7) 冒泡排序的时间复杂度为O(n^2),堆排序的时间复杂度为O(nlogn)。因此,堆排序的性能更好,尤其在数据规模较大的情况下。
阅读全文