Java: 实现顺序表和单链表的快速排序
快速排序
- 快速排序原理
快速排序(Quick Sort)的基本思想是,通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可对这两部分记录继续进行排序,以达到整个序列有序的目的。
- 主程序
package Sort;
public class QuickSort {
private void Qsort(int[] list, int low, int high){
int privot;
if(low < high) {
print(list);
/*算出枢轴值privot*/
privot = Partition(list, low, high);
/*对低子表递归排序*/
Qsort(list, low, privot-1);
/*对高子表递归排序*/
Qsort(list, privot+1, high);
}
}
private int Partition(int[] list, int low, int high){
/*用表的第一个记录做枢轴记录*/
int privotkey = list[low];
while (low < high){
while (low < high && list[high] > privotkey)
high--;
/*将比枢轴记录小的记录交换到低端*/
swap(list, low, high);
while (low < high && list[low] < privotkey)
low++;
/*将比枢轴记录大的记录交换到高端*/
swap(list, low, high);
}
/*返回枢轴所在的位置*/
return low;
}
private void swap(int [] list,int j, int i){
int temp;
temp = list[i];
list[i] = list[j];
list[j] = temp;
}
private void print(int[] data) {
System.out.println("当前list数组的值:");
for (int i = 0; i < data.length; i++) {
System.out.print(data[i] + "\t");
}
System.out.println();
}
public static void main(String[] args) {
int[] list = {50,40,80,30,60,70,10,90,20};
QuickSort qs = new QuickSort();
qs.Qsort(list, 0, list.length-1);
qs.print(list);
}
}
- Qsort()分析
private void Qsort(int[] list, int low, int high){
int privot;
if(low < high) {
print(list);
/*算出枢轴值privot*/
privot = Partition(list, low, high);
/*对低子表递归排序*/
Qsort(list, low, privot-1);
/*对高子表递归排序*/
Qsort(list, privot+1, high);
}
}
- Partition()分析
private int Partition(int[] list, int low, int high){
/*用表的第一个记录做枢轴记录*/
int privotkey = list[low];
while (low < high){
while (low < high && list[high] > privotkey)
high--;
/*将比枢轴记录小的记录交换到低端*/
swap(list, low, high);
while (low < high && list[low] < privotkey)
low++;
/*将比枢轴记录大的记录交换到高端*/
swap(list, low, high);
}
/*返回枢轴所在的位置*/
return low;
}
- 输出结果
当前list数组的值:
50 40 80 30 60 70 10 90 20
当前list数组的值:
20 40 10 30 50 70 60 90 80
当前list数组的值:
10 20 40 30 50 70 60 90 80
当前list数组的值:
10 20 30 40 50 70 60 90 80
当前list数组的值:
10 20 30 40 50 60 70 90 80
当前list数组的值:
10 20 30 40 50 60 70 80 90
- 时间复杂度分析
最优情况下,快速排序算法的时间复杂度为O(nlogn),空间复杂度也为O(nlogn)
- 单链表快速排序实现
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode sortList(ListNode head) {
if(head == null || head.next == null) return head; ListNode left = new ListNode(0), leftHead = left;
ListNode right = new ListNode(0), rightHead = right;
ListNode mid = new ListNode(0), midHead = mid;
int val = head.val; while(head != null) {
if(head.val < val) {
left.next = head;
left = head;
} else if(head.val > val) {
right.next = head;
right = head;
} else {
mid.next = head;
mid = head;
}
head = head.next;
} left.next = null;
right.next = null;
mid.next = null;
return merge(sortList(leftHead.next), midHead.next, sortList(rightHead.next));
} public ListNode merge(ListNode left, ListNode mid, ListNode right) {
ListNode leftTail = getTail(left);
ListNode midTail = getTail(mid);
midTail.next = right;
if(leftTail != null) {
leftTail.next = mid;
return left;
} else {
return mid;
}
} public ListNode getTail(ListNode head) {
if(head == null) return head;
while(head.next != null) {
head = head.next;
}
return head;
}
}
Java: 实现顺序表和单链表的快速排序的更多相关文章
- 【线性表基础】顺序表和单链表的插入、删除等基本操作【Java版】
本文表述了线性表及其基本操作的代码[Java实现] 参考书籍 :<数据结构 --Java语言描述>/刘小晶 ,杜选主编 线性表需要的基本功能有:动态地增长或收缩:对线性表的任何数据元素进行 ...
- Java数据结构-线性表之单链表LinkedList
线性表的链式存储结构,也称之为链式表,链表:链表的存储单元能够连续也能够不连续. 链表中的节点包括数据域和指针域.数据域为存储数据元素信息的域,指针域为存储直接后继位置(一般称为指针)的域. 注意一个 ...
- 线性表源码分享(c++),包含顺序表、单链表、循环链表、双向链表
---恢复内容开始--- 我是一个c++和数据结构的初学者,本文主要是把清华大学出版社的数据结构(用面向对象方法与c++语言描述)(第2版)这本书中第二章线性表的源码抄下来,在学习的过程中有助于加深印 ...
- 线性表 及Java实现 顺序表、链表、栈、队列
数据结构与算法是程序设计的两大基础,大型的IT企业面试时也会出数据结构和算法的题目, 它可以说明你是否有良好的逻辑思维,如果你具备良好的逻辑思维,即使技术存在某些缺陷,面试公司也会认为你很有培养价值, ...
- java实现顺序表、链表、栈 (x)->{持续更新}
1.java实现节点 /** * 节点 * @luminous-xin * @param <T> */ public class Node<T> { T data; Node& ...
- Java 实现简答的单链表的功能
作者:林子木 博客网址:http://blog.csdn.net/wolinxuebin 參考网址:http://blog.csdn.net/sunsaigang/article/details/5 ...
- [数据结构 - 第3章] 线性表之单链表(C++实现)
一.类定义 单链表类的定义如下: #ifndef SIGNALLIST_H #define SIGNALLIST_H typedef int ElemType; /* "ElemType类型 ...
- 线性表之单链表C++实现
线性表之单链表 一.头文件:LinkedList.h //单链表是用一组任意的存储单元存放线性表的元素,这组单元可以是连续的也可以是不连续的,甚至可以是零散分布在内存中的任意位置. //单链表头文件 ...
- 数据结构(java版)学习笔记(三)——线性表之单链表
单链表的优点: 长度不固定,可以任意增删. 单链表的缺点: 存储密度小,因为每个数据元素,都需要额外存储一个指向下一元素的指针(双链表则需要两个指针). 要访问特定元素,只能从链表头开始,遍历到该元素 ...
随机推荐
- freemarke之TemplateDirectiveModel详解
http://hougbin.iteye.com/blog/1457924 TemplateDirectiveModel接口是freemarker自定标签或者自定义指令的核心处理接口.通过实现该接口, ...
- jQuery之动画效果show()......animate()
jQuery之动画效果 1.show()显示效果 语法:show(speed,callback) Number/String,Function speend为动画执行时间,单位为毫秒.也可以为slow ...
- (转)tar 解压缩命令
tar -c: 建立压缩档案-x:解压-t:查看内容-r:向压缩归档文件末尾追加文件-u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个.下面的 ...
- uva-10487 - Closest Sums
暴力枚举后去重最后二分加推断找答案 #include<iostream> #include<map> #include<string> #include<cs ...
- [Usaco2006 Nov]Corn Fields牧场的安排 壮压DP
看到第一眼就发觉是壮压DP 然后就三进制枚举子集吧. 这题真是壮压入门好题... 对于dp[i][j] 表示第i行,j状态下前i行的分配方案数. 那么dp[i][j]肯定是从i-1行转过来的 那么由于 ...
- spring core源码解读之ASM4用户手册翻译之一asm简介
第一章:ASM介绍 1.1 ASM动机: 程序的分析,生成,转换技术可以应用到许多场景: 1.程序分析,从简单的语法解析到完整的语义分析,可以应用在程序中找到潜在的bug,发现无用的代码,工程代码的逆 ...
- 深度剖析:CDN内容分发网络技术原理--转载
1.前言 Internet的高速发展,给人们的工作和生活带来了极大的便利,对Internet的服务品质和访问速度要求越来越高,虽然带宽不断增加,用户数量也在不断增加,受Web服务器的负荷和传输距离等因 ...
- android开发之国际化
国际化,听起来高大上,做起来很简单. 我们来实现一个简单的效果,让应用根据系统的语言来做不同的显示,假如android系统默认是英语,应用就以英文的形式显示,如果android系统默认是中文,则应用就 ...
- Android(java)学习笔记193:利用谷歌API对数据库增删改查(推荐使用)
接下来我们通过项目案例来介绍:这个利用谷歌API对数据库增删改查 1.首先项目图: 2.这里的布局文件activity_main.xml: <LinearLayout xmlns:android ...
- html通用导航条制作
第一步:先创建一个盒子,定义类为 nav,width 1000,height 40px,防京东的导航,与浏览器顶部100px,margin-top:100px,看的更直观 第二步:使用无序列表放置,导 ...