void QSort(int * a,int begin,int end)
{
if(begin < end)
{
int i = begin;
int j = end+1; //关键
int k = a[i],tmp;
while(i < j) //
{
i = i + 1;
while(a[i] < k)
i ++;
j = j - 1;
while(a[j] > k)
j --;
if(i < j)
{
tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}
tmp = a[begin]; //注意此时a[begin] 与 a[j] 交换
a[begin] = a[j];
a[j] = tmp;
QSort(a,begin,j - 1);
QSort(a,j + 1,end);
}
}
上是最简单的快速排序版本
/*
插入排序
*/
void insertSort(int * a,int begin,int end)
{
int tmp;
for(int j = begin + 1;j<= end;j++)
{
tmp = a[j];
int i = j -1;
//while(a[i] < a[j]) //不能这么写,因为a[i] 会被覆盖掉,此时的a[i]已不是彼时的a[i]
while(tmp < a[i])
{
a[i + 1] = a[i];
i --;
}
a[i + 1] = tmp;
}
}
/*
这个算法来自sgi stl
*/
int middle(int a,int b,int c)
{
if(a < b) //其实就是在这个大的条件下,依次return b ,c a
{
if(b < c) // a < b < c
return b;
else if(a < c) // a < b ; b > = c ; a < c
return c;
else // a < b ; a >= c
return a;
}
else {
if(b > c) // a > b > c
return b;
else if(a > c) // a > b ;b <= c;
return c;
else // a > b ; a < c
return a;
}
}
/*
首先,分划元素k 取得是a[begin],a[middel],a[end]的中值
其次,如果分得的子数组长度小于等于3,则调用insertSort
*/
void AdvancedQSort(int * a,int begin,int end)
{
if(begin >= end)
return ;
if(end - begin <= 3)
insertSort(a,begin,end);
else
{
int i = begin,j = end,k = middle(a[i],a[j],a[(i + i) / 2]),tmp;
while(i < j) //
{
i = i + 1;
while(a[i] < k)
i ++;
j = j - 1;
while(a[j] > k)
j --;
if(i < j)
{
tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}
tmp = a[begin]; //注意此时a[begin] 与 a[j] 交换
a[begin] = a[j];
a[j] = tmp;
AdvancedQSort(a,begin,j - 1);
AdvancedQSort(a,j + 1,end);
}
}
分享到:
相关推荐
它的基本思想是分治法,通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到...
它的基本思想是分治法,通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到...
### 快速排序的递归简洁实现 #### 分区函数(Partition) 分区是快速排序的核心步骤,其主要目标是选择一个基准元素(pivot),并将所有小于等于该基准的元素移动到基准的左边,所有大于该基准的元素移动到基准的...
c++代码-递归-快速排序
3. **递归排序**:对基准左边的子数组和右边的子数组分别进行快速排序,这个过程通过递归调用快速排序函数来实现。如果子数组为空,递归结束;否则,重复步骤1和2。 4. **合并结果**:由于排序是就地进行的,不需要...
快速排序和折半查找是两种在计算机科学中广泛使用的算法,尤其在数据处理和搜索操作中扮演着重要角色。在Java编程中,这两种算法都可以通过递归和分治策略进行实现,以提高效率和可读性。下面我们将深入探讨这两个...
它的基本思想是分治法,通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到...
快速排序已经是很成熟的排序方法 递归的缺点就是当排序数据量大时,系统堆栈会溢出 递归的实质是在堆栈中不断保存现场,但是现场的数据量是很大的 网上给出了堆栈实现的伪码算法,但是这里面存在很多的BUG 这个程序...
递归函数通常包含两个部分:递归调用和基本情况。递归调用是函数内部调用自身的过程,而基本情况是递归过程的终止条件,当满足这个条件时,函数不再调用自身,而是直接返回一个值。 在C语言中,递归函数的声明和...
以下是关于"插入排序、选择排序、希尔排序、堆排序、冒泡、双向冒泡、快速排序、归并排序、递归的归并排序、基数排序"这十大经典排序算法的详细解释: 1. 插入排序:插入排序是一种简单的排序算法,它通过构建有序...
### JAVA快速排序(递归实现与非递归堆栈模拟实现) #### 一、递归实现的快速排序 快速排序是一种非常高效的排序算法,它的基本思想是通过一趟排序将待排记录分隔成独立的两部分,其中一部分的所有记录都比另一...
3. **内存管理**:虽然快速排序本身并不涉及大量的内存分配和释放,但在大规模数据处理时,递归深度过深可能导致栈溢出,需要考虑适当的优化,如尾递归或使用迭代版本的快速排序。 4. **枢轴选取**:不同的枢轴选取...
### 排序算法:快速排序(三种排序方式、递归和非递归) #### 快速排序概述 快速排序是一种高效的排序算法,由C. A. R. Hoare于1962年提出。它是基于分治策略的一种排序方法,通过选取一个基准值将待排序数组分为...
快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。...这个非递归版本的快速排序在处理大数据集时,相比递归版本更节省内存,因为它不使用系统栈,但可能在循环次数上稍多一些。
用栈实现的快速排序,避免了原来的递归算法
采用递归分治算法写的快速排序 这是为上机考试准备的,呵呵
"C语言学习之排序数据结构链表堆排序希尔排序快速排序递归排序" 本资源主要介绍了C语言中的排序算法,包括链表、堆排序、希尔排序、快速排序和递归排序等五种方法。同时,文章还提供了每种排序方法的原理、流程图和...
3. **递归排序**:对基准元素左右两边的子数组,分别调用快速排序方法,直到子数组只有一个或零个元素,递归结束。 下面是一个简单的Java实现: ```java public class QuickSort { public static void quickSort...
合并排序算法、快速排序算法和递归分治是计算机科学中的基础概念,它们在数据处理和算法设计中占据着重要地位。以下是对这些知识点的详细解释: **合并排序算法(Merge Sort)** 合并排序是一种基于分治策略的排序...