热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:快速排序和堆排序

本文由编程笔记#小编为大家整理,主要介绍了快速排序和堆排序相关的知识,希望对你有一定的参考价值。快速排序思想:在partition中,首先以最右边的值作为划分值x,分别维护小于
本文由编程笔记#小编为大家整理,主要介绍了快速排序和堆排序相关的知识,希望对你有一定的参考价值。


快速排序思想:在partition中,首先以最右边的值作为划分值x,分别维护小于x的区间,等于x的区间,以及大于x的三个区间,最后返回划分值的左边界和右边界.时间复杂度为O(nlogn).



public class QuickSort {
public static void quickSort(int[] arr) {
if(arr == null || arr.length <2)
return ;
sortProgress(arr, 0 , arr.length - 1);
}
public static void sortProgress(int[] arr, int L, int R) {
if(L //随机取L到R之间的一个数与R交换.
swap(arr, L + (int)(Math.random() * (R - L + 1)), R);
//p数组的大小为2,p[0]表示划分值的左边界,p[1]表示划分值的右边界.
int[] p = partition(arr, L, R);
sortProgress(arr, L, p[0] - 1);
sortProgress(arr, p[1] + 1, R);
}
}
public static int[] partition(int[] arr, int L, int R) {
int less = L - 1;
int more = R;
while(L if(arr[L] swap(arr, ++less, L++);
}else if(arr[L] > arr[R]) {
swap(arr, --more, L);
}else {
L++;
}
}
swap(arr, more, R);
//返回划分值的左边界和右边界
return new int[] {less + 1, more};
}
public static void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
public static void main(String[] args) {
int[] arr = new int[]{123,45,767,343,654,2,66,88};
System.out.print("原始数组:");
for(int i = 0; i if(i != arr.length - 1)
System.out.print(arr[i] + " ");
else
System.out.println(arr[i]);
quickSort(arr);
System.out.print("快速排序后:");
for(int i = 0; i if(i != arr.length)
System.out.print(arr[i] + " ");
else
System.out.println(arr[i]);
}
}

运行结果:
技术图片


堆排序思想:在构建最大堆堆的过程,每次向上调整,只需和父节点进行比较,构建堆的时间复杂度为O(n),在堆排序的过程中,取堆顶元素与最后一个元素交换,然后堆顶元素向下调整,维护最大堆,最终即可完成排序.时间复杂度为O(nlogn).



public class HeapSort {
public static void heapSort(int[] arr) {
if(arr == null || arr.length <2)
return ;
for(int i = 0; i heapInsert(arr, i);
int size = arr.length;
swap(arr, 0, --size);
while(size > 0) {
heapify(arr, 0, size);
swap(arr, 0, --size);
}
}
public static void heapInsert(int[] arr, int index){
while(arr[index] > arr[(index - 1)/2]) {
swap(arr, index, (index - 1)/2);
index = (index - 1) / 2;
}
}
public static void heapify(int[] arr, int index, int size){
int left = 2 * index + 1;
while(left int largest = left + 1 arr[left]? left + 1: left;
largest = arr[index] > arr[largest] ? index: largest;
if(largest == index) {
break;
}
swap(arr, index, largest);
index = largest;
left = 2 * index + 1;
}
}
public static void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
public static void main(String[] args) {
int[] arr = new int[] {3,66,65,43,213,76,66,23};
System.out.print("原始数组:");
for(int i = 0; i if(i != arr.length - 1)
System.out.print(arr[i] + " ");
else
System.out.println(arr[i]);
heapSort(arr);
System.out.print("堆排序后:");
for(int i = 0; i if(i != arr.length - 1)
System.out.print(arr[i] + " ");
else
System.out.println(arr[i]);
}
}

运行结果:
技术图片
总结
快速排序是不稳定的。算法时间复杂度O(nlogn)
堆排序是不稳定的。算法时间复杂度O(nlogn)。


推荐阅读
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Søren Kierkegaard famously stated that life can only be understood in retrospect but must be lived moving forward. This perspective delves into the intricate relationship between our lived experiences and our reflections on them. ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • Java 中 Writer flush()方法,示例 ... [详细]
  • 本文介绍了如何使用 Spring Boot DevTools 实现应用程序在开发过程中自动重启。这一特性显著提高了开发效率,特别是在集成开发环境(IDE)中工作时,能够提供快速的反馈循环。默认情况下,DevTools 会监控类路径上的文件变化,并根据需要触发应用重启。 ... [详细]
  • Java 中的 BigDecimal pow()方法,示例 ... [详细]
  • Java 类成员初始化顺序与数组创建
    本文探讨了Java中类成员的初始化顺序、静态引入、可变参数以及finalize方法的应用。通过具体的代码示例,详细解释了这些概念及其在实际编程中的使用。 ... [详细]
  • 本文介绍如何利用动态规划算法解决经典的0-1背包问题。通过具体实例和代码实现,详细解释了在给定容量的背包中选择若干物品以最大化总价值的过程。 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • 在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • MQTT技术周报:硬件连接与协议解析
    本周开发笔记重点介绍了在新项目中使用MQTT协议进行硬件连接的技术细节,涵盖其特性、原理及实现步骤。 ... [详细]
author-avatar
518094haha
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有