C++实现快速排序(递归)

快速排序是一种平均性能很好的算法,它的期望运行时间是O(nlgn),且其中隐藏的常数因子非常小。但是它的最坏运行时间是O(n^2)。最后我会对其进行分析。快速排序关键部分分为两部分:

1.数组划分过程:

将一个数组以其最后一个元素作为主元,并且围绕它来划分数组,使得在此元素之前的数组元素均小于它,在其后的数组元素均大于它,划分过程如下:

实现代码如下:

int Partition(int a[],int low,int high){ //传递参数为数组、数组上界和下界

int x = a[high],i = low-1;

for(int j = low;j <= high-1;++j){

if(a[j] <= x){

++i;

swap(a[i],a[j]);//交换元素位置

}

}

swap(a[i+1],a[high]);

return i+1;

}

下面是元素交换函数:

void swap(int& first , int& second){

int tem = 0;

tem = first;

first = second;

second = tem;

}

2.快速排序递归实现:

void quickSort(int a[],int low,int high){

if(low <  high){//递归终止条件

int q = Partition(a,low,high); //找到主元位置

quickSort(a,low,q-1);//对主元位置之前的数组进行快速排序

quickSort(a,q+1,high);//对主元位置之后的数组进行快速排序

}

}

3.算法最坏情况分析:

算法的最坏情况就是划分过程中两个区域分别包含1个和n-1个元素的时候,比如数组元素已经排好序,但是划分数组时却仍会使比主元小的数组元素进行自我交换。最坏情况下算法时间复杂度为O(n^2)。

时间: 2024-12-15 04:54:48

C++实现快速排序(递归)的相关文章

快速排序递归非递归队列堆栈实现

递归实现 #include<iostream> using namespace std; template <class T> void QuickSort(T A[],int left,int right) { if(left<right) { int i=left; int j=right+1; do { do i++;while(A[i]<A[left]); do j--;while(A[j]>A[left]); if(i<j) Swap(A[i],A

快速排序-递归和非递归的实现

快速排序主要就是partition的操作. 排序主体 /* 递归的实现.A[] -->要排序的数组, s --> 开始位置, e --> 结束位置 */ void quickSort(int arr[], int s, int e) { if (s < e) { int p = partition(arr, s, e); /* Partitioning index */ quickSort(arr, s, p - 1); quickSort(arr, p + 1, e); } }

笔试算法题(55):快速排序实现之非递归实现,最小k值选择(non-recursive version, Minimal Kth Selection of Quick Sort)

议题:快速排序实现之五(非递归实现,短序列优先处理,减少递归栈大小) 分析: 算法原理:此算法实现适用于系统栈空间不足够快速排序递归调用的需求,从而使用非递归实现快速排序算法:使用显示下推栈存储快速排序中的每一次划分结果 (将left和right都压入堆栈),并且首先处理划分序列较短的子序列(也就是在得到一次划分的左右部分时,首先将长序列入栈,然后让段序列入栈), 这样可以保证当快速排序退化的线性效率的时候,栈大小仍旧在㏒N范围内.算法策略类似于最小子树优先遍历规则: 弱势:当序列已经就绪,每次

std::sort 学习:一种递归分治方法

// std::sort 学习:一种递归分治方法 今天看了看 stl 的 std::sort 的代码,众所周知,这个函数是在快速排序递归太深的时候使用堆排序防止过度退化,但是今天说的不是这个.我们只看快速排序的部分. 我们一般实现快速排序大概是这样的(本王随意写了个用下标当参数的排序函数,领会意思即可). void quick_sort(int first, int last) // 某个数组的 [first, last) {  if ((last - first) > 1) {  int mi

Python 快速排序

def quick_sort(alist, start, end): """快速排序""" # 递归的退出条件 if start >= end: return # 设定起始元素为要寻找位置的基准元素 mid = alist[start] # low为序列左边的由左向右移动的游标 low = start # high为序列右边的由右向左移动的游标 high = end while low < high: # 如果low与high未重合,

快速排序及优化(Java版)

快速排序(Quicksort)是对冒泡排序的一种改进.快速排序由C. A. R. Hoare在1962年提出. 一次快速排序详细过程: 选择数组第一个值作为枢轴值. 代码实现: package QuickSort; public class QuickSortRealize { public static void QuickSort(int[] arr){ QSort(arr,0,arr.length-1); } //对顺序表子序列作快速排序 待排序序列的最小下标值low和最大下标值high

快速排序(取中位数法)

#include<iostream> #include<algorithm> #include<iterator> using namespace std; // 求首元素.中间元素和尾元素的中位数,将中位数与首元素交换位置 inline void medianAsPivot(int arr[], const int& left, const int& right) { const int middle = left+(right-left)>&g

python数据结构与算法第十二天【快速排序】

1. 原理如图所示: 2.代码实现 def quick_sort(alist, start, end): """快速排序""" # 递归的退出条件 if start >= end: return # 设定起始元素为要寻找位置的基准元素 mid = alist[start] # low为序列左边的由左向右移动的游标 low = start # high为序列右边的由右向左移动的游标 high = end while low < high

快速排序(python实现)

def quick_sort(alist, start, end): """快速排序""" # 递归的退出条件 if start >= end: return # 设定起始元素为要寻找位置的基准元素 mid = alist[start] # low 为序列左边的由左向右移动的游标 low = start # high 为序列右边的由右向左移动的游标 high = end while low < high: # 如果low与high未重