快速排序 堆排序 java

快速排序: 

package dudongdong;

import java.util.Arrays;

public class QuickSort {
	public static void main(String[] arges) {
		QuickSort qs=new QuickSort();
		Integer[] arr={15,12,19,4,5,4,9,14};
		Integer n = arr.length;
		qs.quickSort(arr,0,n-1);
	}
	public void quickSort(Integer[] arr,int l,int r) {
		int i=l;
		int j=r;
		int key = arr[l];
		System.out.println("===========");
		while(i<j) {
			System.out.println("i="+i+" j="+j+" key="+key);
			while(i<j && arr[j]>=key) {
				System.out.println(arr[j]);
				j--;
			}
			
			while(i<j && arr[i]<=key) {
				System.out.println(arr[i]);
				i++;
			}
			
			System.out.println("停止寻找:arr[i]="+arr[i]+" arr[j]="+arr[j]
					+" 整个数组:"+Arrays.toString(arr));
			int tmp = arr[i];
			arr[i] = arr[j];
			arr[j] = tmp;
			System.out.println("交换之后:arr[i]="+arr[i]+" arr[j]="+arr[j]
					+" 整个数组:"+Arrays.toString(arr));
		}
		int tmp=arr[i];
		arr[i]=key;
		arr[l]=tmp;
		
		if (l<i-1) {
			System.out.println("向左递归:"+Arrays.toString(Arrays.copyOfRange(arr, l, i-1)));
			System.out.println("l="+l+" i-1="+(i-1));
			quickSort(arr, l, i-1);
		}
		if(i+1<r) {
			System.out.println("\n向右递归:"+Arrays.toString(Arrays.copyOfRange(arr, i+1, r)));
			System.out.println("l="+l+" i-1="+(i-1));
			quickSort(arr, i+1, r);
		}
	}
}

 堆排序: (需要注意的是如果在根节点和叶子节点对比之后未发生位置转换是不需要继续递归的,否则进入死循环。)

package dudongdong;

import java.util.Arrays;

public class HeapSort_test {
	public static void main(String[] args) {
		HeapSort_test hs=new HeapSort_test();
//		Integer[] arr={15,12,19,4,5,4,9,14};
		Integer[] arr={2,3,4,5,1};
		Integer n = arr.length;
		for(int i=n/2-1;i>=0;i--) {
			System.out.println("遍历至:"+arr[i]);
			hs.heapify(arr,n,i);
		}
		for (int i =n-1;i>=0;i--) {
			System.out.println(arr[0]);
			int tmp = arr[0];
			arr[0] = arr[i];
			hs.heapify(arr, n, 0);
			arr[i] = tmp;
			n--;
		}
		System.out.println(Arrays.toString(arr));
	}
	
	public void heapify(Integer[] heap ,int n,int i) {
		if (i>n/2-1) {
			System.out.println("没有孩子 返回");
			return;
		}
		int l = 2*i+1;
		int r = 2*i+2;
		int max = i;
		System.out.println("根:"+heap[max]+" 左孩子:"+heap[l]+" 右孩子:"+heap[r]);
		if(l<n && heap[l]>heap[max]) {
			max = l;
		}
		if(r<n && heap[r]>heap[max]) {
			max = r;
		}
		if (max != i) {
			int tmp = heap[max];
			heap[max]=heap[i];
			heap[i]=tmp;
			System.out.println(Arrays.toString(heap)+" max下标:"+max);
			heapify(heap, n,max);
		}
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java 中的堆排序是一种比较快速的排序算法,它的时间复杂度为 O(nlogn),其中 n 是要排序的数组的长度。它的基本思想是:将数组中的元素构建成一个大根堆,然后依次将堆顶元素(也就是最大的元素)与末尾元素交换,再重新构建大根堆,以此类推,直到整个数组有序。 以下是 Java 中的堆排序代码: ``` public void heapSort(int[] arr) { // 构建大根堆 for (int i = arr.length / 2 - 1; i >= 0; i--) { adjustHeap(arr, i, arr.length); } // 堆排序 for (int j = arr.length - 1; j > 0; j--) { // 将堆顶元素与末尾元素交换 swap(arr, 0, j); // 重新调整为大根堆 adjustHeap(arr, 0, j); } } /** * 调整大根堆 */ public void adjustHeap(int[] arr, int i, int len) { // 将当前节点的值保存到临时变量中 int temp = arr[i]; // k 指向当前节点的左子节点 for (int k = i * 2 + 1; k < len; k = k * 2 + 1) { // 如果当前节点的右子节点存在,并且大于左子节点,则指向右子节点 if (k + 1 < len && arr[k] < arr[k + 1]) { k++; } // 如果子节点大于父节点,则交换 if (arr[k] > temp) { arr[i] = arr[k]; i = k; } ### 回答2: 堆排序(Heap Sort)是一种通过构建最大堆或最小堆来实现的排序算法,它的平均时间复杂度为O(nlogn)。 下面是Java语言实现堆排序的代码: ``` 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[0]; arr[0] = arr[i]; arr[i] = temp; heapify(arr, i, 0); } } // 调整以root为根节点的子树成为最大堆 public static void heapify(int arr[], int size, int root) { int largest = root; // 初始化最大元素为根节点 int left = 2 * root + 1; // 左子节点的索引 int right = 2 * root + 2; // 右子节点的索引 // 如果左子节点大于根节点,将最大元素索引更新为左子节点 if (left < size && arr[left] > arr[largest]) { largest = left; } // 如果右子节点大于根节点,将最大元素索引更新为右子节点 if (right < size && arr[right] > arr[largest]) { largest = right; } // 如果最大元素不是根节点,则交换根节点和最大元素,并继续调整子树 if (largest != root) { int temp = arr[root]; arr[root] = arr[largest]; arr[largest] = temp; heapify(arr, size, largest); } } public static void main(String args[]) { int arr[] = {56, 23, 12, 78, 45, 10, 45}; heapSort(arr); System.out.println("排序后的数组:"); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } } } ``` 以上代码定义了一个`HeapSort`类,其中包含了一个`heapSort`方法和一个`heapify`方法。`heapSort`方法用于执行堆排序算法,而`heapify`方法用于调整以某个节点为根节点的子树,使其成为最大堆。 在`heapSort`方法中,首先从最后一个非叶子节点开始构建最大堆。然后,依次将最大的元素与数组末尾交换,并重新构建最大堆。最后,输出排序后的数组。 在`main`方法中,我们定义了一个待排序的数组,并调用`heapSort`方法对其进行排序。最后,输出排序后的数组。 以上是Java中实现堆排序的代码。 ### 回答3: Java 堆排序是一种使用堆数据结构进行排序的算法。下面是一个简单的Java实现: ```java import java.util.Arrays; public class HeapSort { public static void heapSort(int[] array) { int n = array.length; // 构建最大堆 for (int i = n / 2 - 1; i >= 0; i--) heapify(array, n, i); // 从堆顶开始不断将最大元素移至数组末尾 for (int i = n - 1; i >= 0; i--) { // 交换堆顶元素与当前末尾元素 int temp = array[0]; array[0] = array[i]; array[i] = temp; // 对剩余元素重新构建最大堆 heapify(array, i, 0); } } // 将数组中的元素构建为最大堆 public static void heapify(int[] array, int n, int i) { int largest = i; // 初始化堆顶元素为最大值 int left = 2 * i + 1; // 左子节点的索引位置 int right = 2 * i + 2; // 右子节点的索引位置 // 如果左子节点大于根节点,将largest设置为左子节点 if (left < n && array[left] > array[largest]) largest = left; // 如果右子节点大于当前最大值,将largest设置为右子节点 if (right < n && array[right] > array[largest]) largest = right; // 如果largest不是根节点,将largest与根节点交换,并继续构建最大堆 if (largest != i) { int swap = array[i]; array[i] = array[largest]; array[largest] = swap; heapify(array, n, largest); } } public static void main(String[] args) { int[] array = {10, 7, 8, 9, 1, 5}; heapSort(array); System.out.println(Arrays.toString(array)); } } ``` 上述代码实现了堆排序。首先,它使用构建最大堆的函数 `heapify` 将输入数组构建为最大堆。然后,在每次循环中,将堆顶元素(即最大值)与当前数组末尾元素交换,然后对剩余元素重新构建最大堆。通过这样的迭代过程,最终得到一个有序的数组。 在主函数中,我创建了一个测试数组并调用堆排序函数 `heapSort`。最后,通过使用 `Arrays.toString()` 函数将排序结果打印出来。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值