排序算法二(时间复杂度为O(N*logN))
- 快速排序:
1 package test;- public class QuickSort {
- // 快速排序
- public void quickSort(int s[], int l, int r) {
- if (l < r) {
- // Swap(s[l], s[(l + r) / 2]); //将中间的这个数和第一个数交换 参见注1
- int i = l, j = r, x = s[l];
- while (i < j) {
- while (i < j && s[j] >= x) // 从右向左找第一个小于x的数
- j--;
- if (i < j)
- s[i++] = s[j];
- while (i < j && s[i] < x) // 从左向右找第一个大于等于x的数
- i++;
- if (i < j)
- s[j--] = s[i];
- }
- s[i] = x;
- quickSort(s, l, i - 1); // 递归调用
- quickSort(s, i + 1, r);
- }
- }
- public static void main(String[] args) {
- QuickSort quick = new QuickSort();
- int[] A = { 1, 2, 3, 5, 2, 3 };
- quick.quickSort(A, 0, A.length - 1);
- for (int i = 0; i < A.length; i++) {
- System.out.println(A[i]);
- }
- }
- }
结果运行如下: 1 2 2 3 3 4 5
其主要思想如下:先从原序列中随机选取一个初始值,然后在剩下的数组中分别找出比其小的元素,将其分别放到两个序列中,以此类推,采用随机+分治的思想
堆排序:
- package test;
- public class HeapSortTest {
- public static void main(String[] args) {
- int[] initialData = { 7, 6, 5, 4, 3, 8, 9 };
- HeapSortTest heapSortTest = new HeapSortTest();
- System.out.println("排序之前的原始数据:");
- heapSortTest.print(initialData);
- heapSortTest.heapSort(initialData);
- System.out.println("\n");
- System.out.println("排序之后的数据:");
- heapSortTest.print(initialData);
- }
- public void heapSort(int[] data) {
- // 考虑到需要创建多少次堆
- for (int i = 0; i < data.length - 1; i++) {
- createMaxHeap(data, data.length - 1 - i);
- swap(data, 0, data.length - 1 - i);
- // print(data);
- }
- }
- public void swap(int[] data, int i, int j) {
- int temp = data[i];
- data[i] = data[j];
- data[j] = temp;
- }
- public void createMaxHeap(int[] data, int indexMax) {
- // 需要创建堆
- for (int currentNode = (indexMax - 1) / 2; currentNode >= 0; currentNode--) {
- // 找出子节点中的较大值
- int bigChildNode = 2 * currentNode + 1;
- // 因为每次更新后
- // while (bigChildNode<=indexMax)//这里的等号就是只有一个元素时
- // {
- if (bigChildNode < indexMax) {
- // 选取子节点中较大的那个节点
- if (data[2 * currentNode + 1] < data[2 * currentNode + 2]) {
- bigChildNode = 2 * currentNode + 2;
- }
- }
- if (data[currentNode] < data[bigChildNode]) {
- swap(data, currentNode, bigChildNode);
- // currentNode=bigChildNode;
- }
- // else
- // {
- // break;
- // }
- // }
- }
- }
- public void print(int[] data) {
- for (int i = 0; i < data.length; i++) {
- System.out.print(data[i] + "\t");
- }
- }
- }
输出结果: 排序之前的原始数据: 7 6 5 4 3 8 9 排序之后的数据: 3 4 5 6 7 8 9
其主要思想:就是建造堆和更新堆,需要注意的是:每更新一次堆时,实际上下次就会少更新一个元素,即排序序的部分就会多一个元素。
排序算法二(时间复杂度为O(N*logN))的更多相关文章
- C#中常用的排序算法的时间复杂度和空间复杂度
常用的排序算法的时间复杂度和空间复杂度 常用的排序算法的时间复杂度和空间复杂度 排序法 最差时间分析 平均时间复杂度 稳定度 空间复杂度 冒泡排序 O(n2) O(n2) 稳定 O(1) 快速排序 ...
- 排序算法二:归并排序(Merge sort)
归并排序(Merge sort)用到了分治思想,即分-治-合三步,算法平均时间复杂度是O(nlgn). (一)算法实现 private void merge_sort(int[] array, int ...
- Java排序算法(二):简单选择排序
[基本思想] 在要排序的一组数中.选出最小的一个数与第一个位置的数交换:然后在剩下的数中再找出最小的与第二个位置的数交换,如此循环至倒数第二个数和最后一个数比較为止. 算法关键:找到最小的那个数.并用 ...
- 基本排序算法<二>
归并排序 归并排序,顾名思义,就是通过将两个有序的序列合并为一个大的有序的序列的方式来实现排序.合并排序是一种典型的分治算法:首先将序列分为两部分,然后对每一部分进行循环递归的排序,然后逐个将结果进行 ...
- python 实现排序算法(二)-合并排序(递归法)
#!/usr/bin/env python2 # -*- coding: utf-8 -*- """ Created on Tue Nov 21 22:28:09 201 ...
- python实现排序算法二:归并排序
##归并排序 ##基本思想:对于两个排好序的数组A和B,逐一比较A和B的元素,将较小值放入数组C中,当A或者B数组元素查询完后,将A或者B剩余的元素直接添加到C数组中,此时C数组即为有序数组,这就是归 ...
- 算法 排序NB二人组 堆排序 归并排序
参考博客:基于python的七种经典排序算法 常用排序算法总结(一) 序前传 - 树与二叉树 树是一种很常见的非线性的数据结构,称为树形结构,简称树.所谓数据结构就是一组数据的集合连同它们的储 ...
- java讲讲几种常见的排序算法(二)
java讲讲几种常见的排序算法(二) 目录 java讲讲几种常见的排序算法(一) java讲讲几种常见的排序算法(二) 堆排序 思路:构建一个小顶堆,小顶堆就是棵二叉树,他的左右孩子均大于他的根节点( ...
- 时间复杂度为O(nlogn)的排序算法
时间复杂度为O(nlogn)的排序算法(归并排序.快速排序),比时间复杂度O(n²)的排序算法更适合大规模数据排序. 归并排序 归并排序的核心思想 采用"分治思想",将要排序的数组 ...
随机推荐
- java 11-7String类里的方法的一些案例
1. 把int数组拼接成字符串的案例 需求:把数组中的数据按照指定个格式拼接成一个字符串 举例: int[] arr = {1,2,3}; 分析: A:首先定义一个空的字符串 B:其次先给这个字符串拼 ...
- 谈谈Git的忽略规则.gitignore
对于经常使用Git的朋友来说,.gitignore配置一定不会陌生. 今天就来说说这个.gitignore的使用. 首先要强调一点,这个文件的完整文件名就是“.gitignore”,注意最前面有个“. ...
- 21SpringMvc_异步发送表单数据到Bean,并响应JSON文本返回(这篇可能是最重要的一篇了)
这篇文章实现三个功能:1.在jsp页面点击一个按钮,然后跳转到Action,在Action中把Emp(int id ,String salary,Data data)这个实体变成JSON格式返回到页面 ...
- WebApi 消息拦截
最近公司要求对WebApi 实现服务端信息的监控(服务端信息拦截),由于本人之前没有做过这方便的相关项目所以在做的过程中也是困难重重,探索的过程也是非常痛苦的,好歹最终也算实现了这个功能.所以将这个分 ...
- WPF SDK研究 之 AppModel
Jianqiang's Mobile Dev Blog iOS.Android.WP CnBlogs Home New Post Contact Admin Rss Posts - 528 Artic ...
- 【译】Design For Maturing Android-为日渐成熟的Android做设计
为日渐成熟的Android做设计 [声明] 本篇博文英文版原文来自Smashing Magazine,本人经Smashing Magazine邮件授权后翻译,转载请注明出处.谢谢!原文地址. 我将不定 ...
- TinyFrame框架中的UOW使用方式纠正
我自己的框架中,UOW是可以通过反射提取具体的Repository的,也可以调用Commit方法. 但是正确的应用方式应该是: Using(var uow = new UnitOfWork()) { ...
- 自定义progressBar的旋转圆圈
在手工打造下拉刷新功能 自带的progressBar太丑了 做个也不费事,一个简单的圆形 旋转动画加type是sweep的gradient渐变 <rotate //旋转动画xmlns:andro ...
- Matlab中的数据类型
Matlab中有15种基本数据类型,主要是整型.浮点.逻辑.字符.日期和时间.结构数组.单元格数组以及函数句柄等. 1.整型:(int8:uint8:int16:uint16:int3 ...
- 20135202闫佳歆--week 9 期中总结
期中总结 前半学期的主要学习内容是学习mooc课程<Linux内核分析>以及课本<Linux内核设计与实现>. 所涉及知识点总结如下: 1. Linux内核启动的过程--以Me ...