博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构——排序——快排序算法
阅读量:7194 次
发布时间:2019-06-29

本文共 2250 字,大约阅读时间需要 7 分钟。

快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实作出来。

 使用快速排序法对一列数字进行排序的过程

算法原理

快速排序采用一种“分而治之、各个击破”的观念。

快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。

步骤为:

1、从数列中挑出一个元素,称为 "基准"(pivot),

2、重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。

3、递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

#include 
#include
void swap(int * a, int * b) //交换函数{ int tmp = * a; * a = * b; * b = tmp;}void printArray(int a[], int count) //打印数组元素{ int i; for(i = 0; i < count; i++) printf("%d ",a[i]); printf("\n");}size_t partition(int * ary, size_t len, size_t pivot_i) //划分函数{ size_t i = 0; size_t small_len = 0; int pivot = ary[pivot_i]; swap(&ary[pivot_i], &ary[len - 1]); for (; i < len; i++) { if (ary[i] < pivot) { swap(&ary[i], &ary[small_len]); small_len++; } } swap(&ary[len - 1], &ary[small_len]); //交换元素 return small_len;}void quick_sort(int * ary, size_t len) { if (len == 0 || len == 1) return; size_t small_len = partition(ary, len, 0); quick_sort(ary, small_len); quick_sort(&ary[small_len + 1], len - small_len - 1);}int main(void) { int ary[] = {
2, 4, 12, 25, 13, 5, 3, 1, 7, 6}; size_t len = sizeof(ary) / sizeof(ary[0]); printArray(ary, len); quick_sort(ary, len); printArray(ary, len); return 0;}

C89标准在stdlib.h中定义了抽象数据类型的快速排序函数qsort:

#include 
#include
static int cmp(const void *a, const void *b){ return *(int *)a - *(int *)b;}void printArray(int a[], int count) //打印数组元素{ int i; for(i = 0; i < count; i++) printf("%d ",a[i]); printf("\n");}int main(){ int arr[10] = {
5, 3, 7, 4, 1, 9, 8, 6, 2}; size_t len = sizeof(arr) / sizeof(arr[0]); printArray(arr, len); qsort(arr, 10, sizeof(int), cmp); printArray(arr, len); return 0;}

未完· · ·

http://www.cnblogs.com/archimedes/p/quick-sort-algorithm.html

转载于:https://www.cnblogs.com/qq1129496211/p/4047123.html

你可能感兴趣的文章
前端静态资源版本更新与缓存之——通过gulp 在原html文件上自动化添加js、css版本号...
查看>>
c++ sizeof
查看>>
摘录:测试各阶段的意义
查看>>
成长型思维模式Not yet
查看>>
Dell PowerEdge服务器RAID卡驱动下载
查看>>
安装Stomp扩展时错误提示error: 'zend_class_entry' has no member named 'default_properties'
查看>>
构建之法第六、七章读后感
查看>>
三类人喝豆浆会要命
查看>>
dev NavBarControl控件
查看>>
数据库 锁机制
查看>>
Acdream Xor 简单数学
查看>>
java日期加减
查看>>
gcc编译器
查看>>
jquery.validate 验证机制
查看>>
PhpStorm更换主题,调整背景和字体颜色
查看>>
java——异常
查看>>
matlab从fig文件中提取数据
查看>>
mysql show profiles 使用分析sql 性能
查看>>
POJ 2488 A Knight's Journey (DFS)
查看>>
jvm内存
查看>>