排序算法二(时间复杂度为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²)的排序算法更适合大规模数据排序. 归并排序 归并排序的核心思想 采用"分治思想",将要排序的数组 ...
随机推荐
- 原生js颗粒页换图效果
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- C# WinForm 中Console 重定向输出到ListBox控件中显示
{ VoidAction action = { lstBox.Items. ...
- 007医疗项目-模块一:用户的查找:3.用户表查询的Action和Service
这里主要写Action和Service. 先写Service层: 架构如下:
- 域策略禁用usb
文档及模板可在 http://pan.baidu.com/s/1qYTcjTy 下载 pro_usb_users.adm 此模板可禁用到 指定盘符,针对用户策略 pro_usb_computers ...
- Sql Server UniCode编码解码
); set @s = N'揶'; select UniCode(@s),nchar(UniCode(@s)); 在 SQL Server 中处理 Unicode 字串常数时,您必需在所有的 Unic ...
- 从Python爬虫到SAE云和微信公众号:二、新浪SAE上搭建微信服务
目的:用PHP在SAE上搭建一个微信公众号的服务器. 1.申请一个SAE云账号 SAE申请地址:http://sae.sina.com.cn/ 可以使用微博账号登陆,SAE是新浪的云服务,时间也比较 ...
- PHP基础13:数组排序
<?php //1.对数组进行升序排序 - sort() $cars=array("VOLVO","BMW","BYD"); $fri ...
- sql语句or与union all的执行效率比较
看到一篇文章是讲sql语句or与union all的执行效率比较的,以前没怎么注意这个问题,感觉文章写的不错,转来一看. 文章原链接:http://www.cunyoulu.com/zhuanti/q ...
- 给 Android 开发者的 RxJava 详解
我从去年开始使用 RxJava ,到现在一年多了.今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava ,并且使用的场景越来越多 .而最近这几个 ...
- [CareerCup] 14.2 Try-catch-finally Java中的异常处理
14.2 In Java, does the finally block get executed if we insert a return statement inside the try blo ...