package com.arithmetic.sort; /** * 快速排序法: * 1 选择轴值 ,尽可能使得Left and Right 相等 * 策略: 选择最左边;随机选择;选择平均值 * * @author Administrator * */ public class QuickSort { public static void main(String[] args) { int [] arrays = new int[]{8,2,7,3,6,4,9,1,5,10}; quickSort(arrays, 0, arrays.length-1); for(int i = 0; i<arrays.length;i++){ System.out.print(arrays[i]+" "); } System.out.println(); } /** * 这个函数用于产生轴值或者叫做基准值的位置 * @param begin * @param end * @return */ public static int getPivot(int begin, int end){ return (begin + end) >> 1; } /** * 每一次的分割 * @param arrays * @param begin * @param end * @return */ private static int partition(int[] arrays, int begin, int end){ //得到基准值位置 int pivot = getPivot(begin, end); //得到基准值 int pivotValue = arrays[pivot]; /*将最后一个值赋给pivot 位置,意思就是把轴值作为一个临时变量用于和子序列进行比较,而最后一个 *空着,我们会第一个大于轴值得数据 */ arrays[pivot] = arrays[end]; //只要begin 和 end不相等 ,我们就认为本次排序没有结束 while(begin != end){ //如果begin <end 且 array[begin] < 轴值,我们就认为这个数比轴值小,而不用去管他,就继续比较下一个 while(begin < end && arrays[begin] < pivotValue){ begin++; } //如果begin <end 但是array[begin] > 轴值,我们就把当前值放在最后一个位置 //并且 end位置往前移动一个指针 if(begin < end && arrays[begin] > pivotValue){ arrays[end] = arrays[begin]; end--; } //此时我们就从右边开始比较比,比轴值小的放到刚才begin的位置,如果比轴值大,我们不管 while(begin < end && arrays[end] >= pivotValue ){ end --; } //如果begin < end, 但是array[end] < 轴值,我们就把当前值放在begin空着的那个位置 if(begin < end && arrays[end] < pivotValue){ arrays[begin] = arrays[end]; begin++; } } //如果begin 和 end 相遇,即begin == end,此时两个下标指向同一个元素,即轴值 arrays[begin] = pivotValue; return begin; } /** * 开始进行快速排序 * @param arrays * @param low * @param high */ public static void quickSort(int[] arrays, int low, int high){ if((high - low) < 1){//如果只有一个数或者为空 直接返回 return; } if((high - low) == 1){//如果只有2个数,且前面的数大于后面的数,我们直接交换没有必要快速排序 if(arrays[low] > arrays[high]){ swap(arrays, low, high); } } int pivotPosition = partition(arrays, low, high); quickSort(arrays, low, pivotPosition);//(递归)前面那个子序列 quickSort(arrays, pivotPosition+1, high);//(递归)后面子序列 } /** * 进行值交换 * @param arrays * @param index1 * @param index2 */ public static void swap(int[] arrays,int index1, int index2 ){ int tmp = arrays[index1]; arrays[index1] = arrays[index2]; arrays[index2] = tmp; } }
相关推荐
C语言算法--快速排序法
快速排序算法详解 快速排序(Quick Sort)是一种分治思想的排序算法,它的基本思想是通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,然后再分别对这两部分记录继续...
数据结构与算法 - 快速排序算法实现报告 在数据结构与算法的学习过程中,快速排序算法是一种重要的排序算法,它具有排序速度快、就地排序的优点,但也具有不稳定性。以下是快速排序算法的详细实现报告。 快速排序...
快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是分治法(Divide and Conquer),通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的...
本主题将详细探讨四种常见的排序算法:选择排序、插入排序、快速排序以及冒泡排序,它们都是用C语言实现的。以下是这些排序算法的详细解析: 1. **选择排序(Selection Sort)** - 选择排序是一种简单直观的排序...
快速排序算法设计与分析 快速排序(Quicksort)是一种高效的排序算法,由美国计算机科学家Tony Hoare在1960年发明。该算法的时间复杂度平均为O(n log n),在实际应用中非常常用。 一、快速排序算法的基本思想 ...
经典排序算法 - 快速排序Quick sort 经典排序算法 - 桶排序Bucket sort 经典排序算法 - 插入排序Insertion sort 经典排序算法 - 基数排序Radix sort 经典排序算法 - 鸽巢排序Pigeonhole sort 经典排序算法 - ...
本实验旨在通过对两种经典排序算法——快速排序和归并排序的研究与实现,深入理解它们的基本原理、时间复杂度,并通过编程实践比较这两种算法在不同数据规模下的性能表现。 #### 二、快速排序 **1. 基本思想** ...
快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是分治法(Divide and Conquer),将一个大问题分解为小问题来解决。快速排序的主要步骤包括选择一个基准元素、划分数组...
算法设计,快速排序的C++实现代码,并测试运行时间
快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是分治法(Divide and Conquer),将一个大问题分解为小问题来解决,最终合并小问题的结果得到原问题的解。在数据结构中,...
算法设计及分析实验报告---快速排序.doc
6. **快速排序与其他排序算法的比较** #### 递归算法的概念及应用 递归是一种非常强大的编程技巧,它通过函数自身调用来解决问题。在C语言中,递归函数通常用于解决那些可以通过重复相同或相似子问题来分解的问题。...
本文将对快速排序、归并排序、堆排序等常见排序算法进行比较和分析,探讨它们的优缺点和适用场景。 首先, let's 看一下这些排序算法的时间复杂度和空间复杂度: | 排序算法 | 平均情况 | 最好情况 | 最坏情况 | ...
本主题将深入探讨四种常见的排序算法:归并排序、快速排序以及与链表相关的排序方法。 首先,我们来讨论归并排序(Merge Sort)。这是一种基于分治策略的排序算法。归并排序将大问题分解为小问题,然后逐步合并这些...
Java-快速排序、冒泡排序和堆排序三种排序讲解、对比及总结 Java-快速排序、冒泡排序和堆排序三种排序讲解、对比及总结 Java-快速排序、冒泡排序和堆排序三种排序讲解、对比及总结
快速排序是一种高效的排序算法,由英国计算机科学家C. A. R. Hoare在1960年提出。其核心思想是分治法,通过一趟排序将待排序的数组分为两个子数组,使得左边的元素均小于右边的元素,然后分别对这两个子数组进行递归...
本篇文章将详细讨论几种常见的排序算法:选择排序、冒泡排序、插入排序、合并排序以及快速排序,分析它们的算法原理、时间效率,并通过经验分析验证理论分析的准确性。 **1. 选择排序(Selection Sort)** 选择排序...