快速排序,虽然最坏时候的时间复杂度是O(n*n),但是平均时间复杂度是O(nlogn),所以快排是一个效率蛮高的排序方法。
下面可以参考一下实现
///////////////////////////////////////////////////////////////////
// 文件名称: qSort.c
// 功能:实现简单的快排
//
// 快排的基本思想是, 在数组中,选定某一元素为支点, 将
// 将小于该支点的数排在该数的左边, 大于该支点的数排在它右边
// 这样此支点就找到了自己的正确的位置。反复迭代,就直到完全排好序
//
// 参考算法导论 (对于partition, 算法导论和 数据结果上略微有点不同同)
///////////////////////////////////////////////////////////////////
#include <stdio.h>
///////////////////////////////////////////////////////////////////
// 功能描述: 在数组A中, 将下标为q到r的部分进行操作, 使得以 A[r]为支点
// 将大于A[r]排在它的左边, 小于A[r]的放在它的右边
// 输入参数:
// A: 指向数组的指针
// q: 操作的起始下标
// r: 操作的数组的终止下标
// 输出参数:
// 无
// 返回值:
// A[r] 即支点的新位置
///////////////////////////////////////////////////////////////////
int partition(int *A, int q, int r)
{
if (q>r)
return -1;
int i = 0, j = 0, temp = 0, x = 0;
i = q - 1; //记录当前小于A[r]的数中,最右边那个数的位置
j = q; //遍历 A[q] 到 A[r]的变量
x = A[r]; //记录支点
for (j=q; j<r; j++){
if (A[j]<x){
//因A[i]是最右边的小于x的, A[i+1]>=x
//所以此时 A[i+1]和 A[j]进行交换, 让小于x的放在一起
i++;
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
//for 循环结束后, A[p]到A[r-1]已经被分开了,
//其中A[q] 到A[i]是小于 x(A[r])的, A[i+1]到A[r-1]是不小于x
//所以,接下来, 应该??? A[r] 和 A[i+1] 交换
i++;
temp = A[i];
A[i] = x;
A[r] = temp;
return i; //返回 A[r]的位置
}
//递归进行排序
void qSort(int *A, int q, int r)
{
int pivot = 0;
pivot = partition(A, q, r); //使A[r]恢复到正确的位置
if (pivot == -1)
return ;
qSort(A, q, pivot-1); //依次将 A[q]--A[pivot-1]排好序
qSort(A, pivot+1, r);
}
//main函数测试
int main()
{
int A[10] = {40, 30, 20, 60, 90, 80, 10, 50, 70, 1};
qSort(A, 0, 9);
int i = 0;
for (i=0; i<10; i++){
printf("%d", A[i]);
if (i<9)
printf("\t");
}
printf("\n");
return 0;
}
分享到:
相关推荐
快速排序快速排序 快速排序 快速排序 快速排序 快速排序
1、熟悉快速排序的串行算法 2、熟悉快速排序的并行算法 3、实现快速排序的并行算法 3.2 实验环境及软件 单台或联网的多台PC机,Linux操作系统,MPI系统。 3.3实验内容 1、快速排序的基本思想 2、单处理机上快速...
快速排序快速排序快速排序快速排序快速排序快速排序快速排序快速排序快速排序快速排序快速排序快速排序快速排序快速排序快速排序快速排序快速排序快速排序快速排序快速排序快速排序快速排序快速排序快速排序快速排序...
(1)用随机快速排序的方法,对输入的数值以从大到小的顺序进行快速排序。 (2)对随机快速排序和冒泡排序这两种排序方法进行比较,测试其在不同数值大小的情况下算法运行的时间复杂度。 二、 实验要求 快速排序...
快速排序,比较高效的排序算法之一。这是一个例子,一个关于快速排序的例子。
(1) 完成5种常用内部排序算法的演示,5种排序算法为:快速排序,直接插入排序,选择排序,堆排序,希尔排序; (2) 待排序元素为整数,排序序列存储在数据文件中,要求排序元素不少于30个; (3) 演示程序开始,...
全面的排序算法实现,包括插入排序、合并排序、堆排序、快速排序。 堆排序:HeapSort 讲解详见http://blog.csdn.net/fly_yr/article/details/8550701 插入排序:InSertion_Sort 讲解详见...
用函数实现快速排序,并输出每次分区后排序的结果 Input 第一行:键盘输入待排序关键的个数n 第二行:输入n个待排序关键字,用空格分隔数据 Output 每行输出每趟排序的结果,数据之间用一个空格分隔 Sample Input ...
C语言实现多种链表快速排序
快速排序是实际运用中用的最多的算法,虽然它在最坏的情况下会达到n^2,但它的平均性能非常好,期望时间复杂度为nlgn,而且隐含的常数因子非常小,并且是原址排序。 快速排序原理:从一组数中任意选出一个数,将...
(1) 冒泡排序和快速排序; (2) 插入排序和希尔排序; (3) 选择排序和堆排序; (4) 递归和非递归的归并排序。 2. 产生不同规模和分布的数据,以 Excel 生成算法执行时间 T(n)关于输入规模 n 的曲线的形式,...
快速排序是对冒泡排序的一种本质改进。它的基本思想是通过一趟 扫描后,使得排序序列的长度能大幅度地减少。在冒泡排序中,一次 扫描只能确保最大数值的数移到正确位置,而待排序序列的长度可能只 减少1。快速...
快速排序的并行实现,提高效率。快速排序算法并行化的一个简单思想是,对每次划分过后所得到的两个序列分别使用两个处理器完成递归排序。
选择排序 冒泡排序 插入排序 合并排序 快速排序算法原理及代码实现 不同排序算法时间效率的经验分析方法 验证理论分析与经验分析的一致性 当面临巨大数据量的排序的时候,还是优先选择合并排序算法和快速排序算法。...
1)实现快速排序算法。 2)要求输入待排序元素个数,利用随机函数生成指定数目的元素,元素值的 取值范围为[10, 1000000]。 3)运行快速排序程序对所生成元素进行排序,要求将元素的初始输入序列和 排序后的结果序列...
快速排序算法,C语言 快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有...
冒泡排序和快速排序的时间性能 冒泡排序和快速排序的时间性能 冒泡排序和快速排序的时间性能 冒泡排序和快速排序的时间性能 冒泡排序和快速排序的时间性能
知道快速排序算法的思想,但是一直都没有动手写,今天写了下,发现还不是那么容易
按所推荐的程序在IE下跑了下,的确,排序耗时很小。 代码如下: [removed] /* * 洗牌 */ function ... /* * 快速排序,按某个属性,或按“获取排序依据的函数”,来排序. * @method soryBy * @static * @
快速排序算法是当前使用最多的排序算法之一,它的基本思想是分治法,选择一个划分元,将小于划分元的元素放在左边,将大于划分元的元素放在右边,针对左右子序列重复此过程,直到序列为空或者只有一个元素,这是基本...