排序算法二(时间复杂度为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²)的排序算法更适合大规模数据排序. 归并排序 归并排序的核心思想 采用"分治思想",将要排序的数组 ...
随机推荐
- sublime text2 常用快捷键
1. ctrl+方向键 按单词移动 2. ctrl+shift + 方向键 按单词选取 3. ctrl + F3 查找选定的或光标所在单词 4. F3 查找特定的单词(一般查找的流程是先ctrl+ ...
- gridpanel分组汇总
[ExtJS5学习笔记]第三十节 sencha extjs 5表格gridpanel分组汇总 2015-05-31 86 本文地址:http://blog.csdn.net/sushengmi ...
- 静态时序分析(static timing analysis)
静态时序分析(static timing analysis,STA)会检测所有可能的路径来查找设计中是否存在时序违规(timing violation).但STA只会去分析合适的时序,而不去管逻辑操作 ...
- C#中的默认访问修饰符
1.命名空间下的元素的默认访问修饰符 public : 同一程序集的其他任何代码或引用该程序集的其他程序集都可以访问该类型或成员.internal : 同一程序集中的任何代码都可以访问该类型或成员,但 ...
- 将Log4net的配置配置到的独立文件中
本文转载:http://blog.csdn.net/wanzhuan2010/article/details/7587780 另外一篇博客:http://grim1980.blog.sohu.com/ ...
- 使用POI getCell 获取空的单元格之后在使用的时候报 NullPointerException
解决办法,在得到cell之后先判断cell是否为空,然后再进行逻辑处理. 得到的cell建议使用去除策略(如左对齐,居中等)的cell,不然有可能受到策略影响而导致结果异常. org.apache.p ...
- jQuery Event.stopPropagation() 函数详解
stopPropagation()函数用于阻止当前事件在DOM树上冒泡. 根据DOM事件流机制,在元素上触发的大多数事件都会冒泡传递到该元素的所有祖辈元素上,如果这些祖辈元素上也绑定了相应的事件处理函 ...
- 三层ViewPager嵌套 的事件处理
这么多ViewPager嵌套在一起肯定会遇到冲突 不信你试试(笑脸) 下面来说怎么解决.....太为难我这个菜b了 设置外部的父控件不要拦截我子控件的事件,通过重写ViewPager的 @Overri ...
- [CareerCup] 8.4 Parking Lot 停车场问题
8.4 Design a parking lot using object-oriented principles. LintCode上的原题,请参见我的另一篇博客Parking Lot 停车场问题. ...
- [MetaHook] Quake Bink function
If you want to play Bink video in game, maybe you need this code. QBink.h #ifndef QBINK_H #define QB ...