快速排序算法:是排序算法中最常用的算法之一。
复杂度:o(nlog2(n))
思想:随即找某一个位置的值为n,把n放在应该所在的位置index,把数组中小于n的值放在index之前,大于n的值放在index之后。然后对index之前的的数组递归以上逻辑,对index之后的数组递归以上逻辑!
实现思想:从前找到一个大于n的值的位置index1,从后找到一个小于n的值位置index2,交换index1 和 index2 的值,然后考虑把n放到应该所在的位置即可。
本算法是选择最后一个位置的值当做pivot的值。
package cn.horizon.sort;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
* 快速排序算法
*
* @author create by [url=xinchunwang@aliyun.com]新春.王[/url] <br>
* date :May 27, 2013 7:47:22 AM
*/
public class QuickSort {
public static void main(String[] args) {
Integer[] arr = initUnSortData(100);
quickSort(arr);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
public static void quickSort(Integer[] a) {
quickSort(a, 0, a.length - 1);
}
/**
* 快速排序
*
* @param a 数组a
* @param start 开始位置
* @param end 结束位置
*/
private static void quickSort(Integer[] a, int start, int end) {
int left = start; // 左边界
int right = end - 1; // 右边界
int pivot = a[end]; // 中枢值
while (left < right) {//确保left < right ,退出:left == right
if (a[left] <= pivot) { //如果a[left]< pivot,那么左边界 left++
left++;
continue;
}
if (a[right] > pivot) { //如果 a[right] > pivot ,那么右边界 right --
right--;
continue;
}
/*交换位置。
* 注意:
* left++ : 因为交换后的left 就是 a[right] 对应的值,a[right] 是<= pivot。
* right--:因为 a[right] 对应的值是 a[left] 是> pivot*/
swap(a, left++, right--);
}
//如果left的值 小于 pivot,那么可以确认a[left] 在pivot之前,那么left++,就可以把left++的值和pivot交换了
if (a[left] < pivot) {
left++;
}
swap(a, left, end); //把中枢值放到 left的位置 ,把left现在这个较大的值放到最后面去吧。
if (left - 1 > start) { // pivot 的左侧排序
quickSort(a, start, left - 1);
}
if (left + 1 < end) { // pivot 的右侧排序
quickSort(a, left + 1, end);
}
}
public static void swap(Integer[] a, int left, int right) {
int temp = a[left];
a[left] = a[right];
a[right] = temp;
}
private static Integer[] initUnSortData(int size) {
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < size; i++) {
list.add(new Random(i).nextInt(i + 1));
}
return list.toArray(new Integer[list.size()]);
}
}
分享到:
相关推荐
经典排序算法 - 快速排序Quick sort 经典排序算法 - 桶排序Bucket sort 经典排序算法 - 插入排序Insertion sort 经典排序算法 - 基数排序Radix sort 经典排序算法 - 鸽巢排序Pigeonhole sort 经典排序算法 - ...
本文将对快速排序、归并排序、堆排序等常见排序算法进行比较和分析,探讨它们的优缺点和适用场景。 首先, let's 看一下这些排序算法的时间复杂度和空间复杂度: | 排序算法 | 平均情况 | 最好情况 | 最坏情况 | ...
本主题将详细探讨四种常见的排序算法:选择排序、插入排序、快速排序以及冒泡排序,它们都是用C语言实现的。以下是这些排序算法的详细解析: 1. **选择排序(Selection Sort)** - 选择排序是一种简单直观的排序...
在本文中,我们将深入探讨基于FPGA的并行快速排序算法,特别关注“位宽可设”的特性。这种算法能够高效地处理大量数据,并且在硬件实现上具有很高的灵活性。我们将从以下几个方面来阐述这个主题: 一、快速排序算法...
快速排序算法详解 快速排序(Quick Sort)是一种分治思想的排序算法,它的基本思想是通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,然后再分别对这两部分记录继续...
快速排序是一种高效的排序算法,由C.A.R. Hoare在1960年提出,它采用了分治(Divide and Conquer)策略。快速排序的基本思想是通过一趟排序将待排序的数据分割成两部分,其中一部分的所有数据都比另一部分的所有数据...
本篇文章将详细讨论几种常见的排序算法:选择排序、冒泡排序、插入排序、合并排序以及快速排序,分析它们的算法原理、时间效率,并通过经验分析验证理论分析的准确性。 **1. 选择排序(Selection Sort)** 选择排序...
Java代码-排序-直接插入排序、希尔排序、直接选择排序、冒泡排序、堆排序、快速排序、归并排序中部分排序以及算法-贪心法,大家可以将源码下载下来进行学习,附带着注释和解释,有不理解的可以找博主一起探讨,共同...
快速排序算法是一种高效的排序算法,它的工作原理是通过选择一个元素作为pivot,然后将数组分为两个部分,以达到排序的目的。快速排序算法的时间复杂度为O(n log n),因此它适合大规模的数据排序。 5.归并排序算法 ...
快速排序算法设计与分析 快速排序(Quicksort)是一种高效的排序算法,由美国计算机科学家Tony Hoare在1960年发明。该算法的时间复杂度平均为O(n log n),在实际应用中非常常用。 一、快速排序算法的基本思想 ...
本主题将深入探讨四种常见的排序算法:归并排序、快速排序以及与链表相关的排序方法。 首先,我们来讨论归并排序(Merge Sort)。这是一种基于分治策略的排序算法。归并排序将大问题分解为小问题,然后逐步合并这些...
数据结构与算法 - 快速排序算法实现报告 在数据结构与算法的学习过程中,快速排序算法是一种重要的排序算法,它具有排序速度快、就地排序的优点,但也具有不稳定性。以下是快速排序算法的详细实现报告。 快速排序...
本实验涉及了四种经典的内部排序算法:希尔排序、快速排序、堆排序和归并排序。 **希尔排序**(Shell Sort)是由希尔提出的,它是一种改进的插入排序。希尔排序的核心思想是将待排序的元素按照一定的间隔分组,对每...
5. 快速排序(Quick Sort):快速排序是一种分治策略的排序算法,通过选取一个“基准”元素,将数组分为两部分,一部分的所有元素都小于基准,另一部分的所有元素都大于基准,然后再对这两部分进行快速排序。...
C语言算法--快速排序法
快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是分治法(Divide and Conquer),将一个大问题分解为小问题来解决,最终合并小问题的结果得到原问题的解。在数据结构中,...
快速排序算法相关分析 快速排序算法是一种有效的排序算法,虽然算法在最坏的情况下运行时间为 O(n^2),但由于平均运行时间为 O(nlogn),并且在内存使用、程序实现复杂性上表现优秀,尤其是对快速排序算法进行随机化...
本实验旨在通过对两种经典排序算法——快速排序和归并排序的研究与实现,深入理解它们的基本原理、时间复杂度,并通过编程实践比较这两种算法在不同数据规模下的性能表现。 #### 二、快速排序 **1. 基本思想** ...
"数据结构和算法-13-快速排序.pdf"这个文件很可能是对快速排序的详细讲解,包括理论介绍、伪代码、示例分析和可能的优化策略等内容。通过阅读这份资料,你可以更深入地了解快速排序的工作原理,提升你的编程技能,并...
### 快速排序算法 快速排序是一种高效的排序算法,采用分而治之的策略,其核心思想是选择一个基准元素,通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再...