快速排序:
设定一个枢纽的值,一般以首个元素的值为枢纽的值,把比枢纽小的元元素放在左边,比枢纽值大的元素放在右边,最后把枢纽的值放到合适的位置。根据返回枢纽的位置,对以上过程进行递归。
/**
* EnhancedQuickSort.java
*
* 快速排序
*
* @author Administrator
*/
public class QuickSort {
public static void quickSort(int[] a) {
qSort(a, 0, a.length - 1);
}
/**
* 对下标从s到t的元素进行快速排序。
*/
public static void qSort(int[] a, int s, int t) {
if (s < t) {
int pivot = partition(a, s, t);
qSort(a, s, pivot - 1);
qSort(a, pivot + 1, t);
}
}
/**
* 该方法返回枢纽的下标。
*/
public static int partition(int[] a, int p, int r) {
int i = p, j = r + 1;
int x = a[p];
/**
* 将 >= x的元素交换到右边区域,<= x的元素交换到左边区域。
*/
while (true) {
while (a[++i] < x) {
if (i >= r)
break;
}
while (a[--j] > x)
;
if (i >= j)
break;
Util.swap(a, i, j);
}
a[p] = a[j];
a[j] = x;
return j;
}
public static void main(String[] args) throws Exception {
if (args.length == 0) {
System.out.println("请输入数字以空格隔开");
System.exit(-1);
}
int[] a = new int[args.length];
for (int i = 0; i < args.length; i++)
a[i] = Integer.parseInt(args[i]);
// int[] a = new int[100];
// for(int i = 0; i < a.length; i++)a[i] = 100-i;
quickSort(a);
// 输出排序后的数组元素。
for (int i = 0; i < a.length; i++)
System.out.println(a[i]);
}
}
改进型:随机枢纽快速排序RadomQuickSort.java
/**
* RadomQuickSort.java
*
* 随机枢纽快速排序.每次都随机选择无序序列中的一个数为枢纽的值.
*
* @author Administrator
*
*/
public class RadomQuickSort {
public static int radomPartition(int[] a, int p, int r) {
// 生成p到r之间的一个随机数j
int j = (int) Math.round(Math.random() * (r - p)) + p;
Util.swap(a, p, j);
return QuickSort.partition(a, p, r);
}
public static void rQSort(int[] a, int s, int t) {
if (s < t) {
int pivot = radomPartition(a, s, t);
rQSort(a, s, pivot - 1);
rQSort(a, pivot + 1, t);
}
}
public static void radomQuickSort(int[] a) {
rQSort(a, 0, a.length - 1);
}
public static void main(String[] args) throws Exception {
if (args.length == 0) {
System.out.println("请输入数字以空格隔开");
System.exit(-1);
}
int[] a = new int[args.length];
for (int i = 0; i < args.length; i++)
a[i] = Integer.parseInt(args[i]);
radomQuickSort(a);
// 输出排序后的数组元素。
for (int i = 0; i < a.length; i++)
System.out.println(a[i]);
}
}
分享到:
相关推荐
快速排序快速排序 快速排序 快速排序 快速排序 快速排序
本文将深入探讨四种在C++中实现的常见排序算法:插入排序、冒泡排序、堆排序和快速排序。这些算法各有特点,适用于不同的场景,理解并掌握它们对于提升编程能力至关重要。 1. **插入排序**: 插入排序是一种简单的...
直接插入排序 选择排序 堆排序 归并排序 快速排序 冒泡排序等七种排序方法
"C语言学习之排序数据结构链表堆排序希尔排序快速排序递归排序" 本资源主要介绍了C语言中的排序算法,包括链表、堆排序、希尔排序、快速排序和递归排序等五种方法。同时,文章还提供了每种排序方法的原理、流程图和...
本主题将深入探讨四种常见的排序算法:堆排序、快速排序以及两种未在标题中明确提到但同样重要的排序方法——基数排序和计数排序。 首先,让我们详细了解一下堆排序。堆排序是一种基于比较的排序算法,利用了数据...
10个数据结构课程设计实例二叉树建立遍历冒泡排序快速排序等10个数据结构课程设计实例二叉树建立遍历冒泡排序快速排序等10个数据结构课程设计实例二叉树建立遍历冒泡排序快速排序等 10个数据结构课程设计实例二叉树...
基本排序气泡排序插入排序快速排序双通道快速排序三通道快速排序堆排序.zip
C语言数据结构课程设计实例二叉树建立遍历冒泡排序快速排序等 C语言数据结构课程设计实例二叉树建立遍历冒泡排序快速排序等 C语言数据结构课程设计实例二叉树建立遍历冒泡排序快速排序等 C语言数据结构课程设计实例...
基于c语言10个数据结构课程设计实例二叉树建立遍历冒泡排序快速排序等 基于c语言10个数据结构课程设计实例二叉树建立遍历冒泡排序快速排序等 基于c语言10个数据结构课程设计实例二叉树建立遍历冒泡排序快速排序等 ...
本资源包"选择排序 冒泡排序 插入排序 快速排序 堆排序.zip"聚焦于五种经典的排序算法,包括选择排序、冒泡排序、插入排序、快速排序以及堆排序。这些算法的实现语言是Objective-C,这是一种强大的面向对象的编程...
二叉树建立遍历冒泡排序快速排序算法:C语言编程实现10个数据结构课程设计实例.zip 二叉树建立遍历冒泡排序快速排序算法:C语言编程实现10个数据结构课程设计实例.zip 二叉树建立遍历冒泡排序快速排序算法:C语言...
常见的经典排序算法有希尔排序、二分插入法、直接插入法、带哨兵的直接排序法、冒泡排序、选择排序、快速排序、堆排序等。 一、希尔排序(Shell 排序法) 希尔排序法,又称宿小增量排序,是 1959 年由 D.L.Shell ...
### 快速排序知识点解析 #### 一、快速排序简介 快速排序是一种高效的排序算法,由英国计算机科学家托尼·霍尔(Tony Hoare)在1960年提出。它采用分治策略来把一个序列分为较小和较大的两个子序列,然后递归地...
直接插入排序、冒泡排序、快速排序、直接选择排序、堆排序和二路归并排序是计算机科学中经典的排序算法,它们在数据处理和算法学习中占有重要地位。这些排序算法各有特点,适用场景不同,下面将逐一详细介绍,并结合...
插入排序 并归排序 桶排序 快速排序这些算法书上的经典算法,给出了算法过程,可供测试实际运行效率或者学习算法本身
选择排序、插入排序和快速排序都是经典的排序算法,各有其特点和适用场景。接下来,我们将详细探讨这三个排序算法。 1. **选择排序(Selection Sort)** 选择排序是一种简单直观的排序算法。它的基本思想是在未...
不错的练手C语言课程设计例子--10个数据结构课程设计实例、二叉树建立遍历冒泡排序快速排序等 不错的练手C语言课程设计例子--10个数据结构课程设计实例、二叉树建立遍历冒泡排序快速排序等 不错的练手C语言课程设计...
本文将深入探讨三种常见的高效排序算法:堆排序、快速排序和归并排序。它们都是基于不同的原理和策略,具有各自的优势和适用场景。 首先,堆排序是一种基于比较的排序算法,利用了二叉堆的数据结构。二叉堆是一个...
排序算法汇总P: 冒泡排序快速排序直接选择排序插入排序希尔排序 堆排序........
实现以下常用的内部排序算法并进行性能比较:"直接插入排序"," 折半插入排序"," 2—路插入排序"," 表插入排序"," 希尔排序"," 起泡排序"," 快速排序"," 简单选择排序"," 树形选择排序"," 堆排序"," 归并排序"," 链式...