认知算法(八)

简介: 认知算法(八),一起来学习吧。

嗨,欢迎来到异星球,我是小怪同志。这篇文章主要讲认识算法,请一起学习吧。

一、快速排序

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

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

快速排序又是一种分而治之思想在排序算法上的典型应用。本质上来看,快速排序应该算是在冒泡排序基础上的递归分治法。

快速排序的名字起的是简单粗暴,因为一听到这个名字你就知道它存在的意义,就是快,而且效率高!它是处理大数据最快的排序算法之一了。虽然 Worst Case 的时间复杂度达到了 O(n²),但是人家就是优秀,在大多数情况下都比平均时间复杂度为 O(n logn) 的排序算法表现要更好,可是这是为什么呢,我也不知道。好在我的强迫症又犯了,查了 N 多资料终于在《算法艺术与信息学竞赛》上找到了满意的答案:

快速排序的最坏运行情况是 O(n²),比如说顺序数列的快排。但它的平摊期望时间是 O(nlogn),且 O(nlogn) 记号中隐含的常数因子很小,比复杂度稳定等于 O(nlogn) 的归并排序要小很多。所以,对绝大多数顺序性较弱的随机数列而言,快速排序总是优于归并排序。

  1. 算法步骤
    1.从数列中挑出一个元素,称为 "基准"(pivot);

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

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

二、代码实现

typedef struct _Range {

int start, end;

} Range;

Range new_Range(int s, int e) {

Range r;
r.start = s;
r.end = e;
return r;

}

void swap(int x, int y) {

int t = *x;
*x = *y;
*y = t;

}

void quick_sort(int arr[], const int len) {

if (len <= 0)
    return; // 避免len等於負值時引發段錯誤(Segment Fault)
// r[]模擬列表,p為數量,r[p++]為push,r[--p]為pop且取得元素
Range r[len];
int p = 0;
r[p++] = new_Range(0, len - 1);
while (p) {
    Range range = r[--p];
    if (range.start >= range.end)
        continue;
    int mid = arr[(range.start + range.end) / 2]; // 選取中間點為基準點
    int left = range.start, right = range.end;
    do {
        while (arr[left] < mid) ++left;   // 檢測基準點左側是否符合要求
        while (arr[right] > mid) --right; //檢測基準點右側是否符合要求
        if (left <= right) {
            swap(&arr[left], &arr[right]);
            left++;
            right--;               // 移動指針以繼續
        }
    } while (left <= right);
    if (range.start < right) r[p++] = new_Range(range.start, right);
    if (range.end > left) r[p++] = new_Range(left, range.end);
}

}

相关文章
|
6月前
|
安全 测试技术
认识-认知
认识-认知
101 0
|
Kubernetes 负载均衡 网络协议
K8S 的新认知与初领会
我们今天开始正式进⼊ Kubernetes 的课程学习,Kubernetes 相信各位已经听过很多次了,那么什么是 Kubernetes呢?
K8S 的新认知与初领会
|
存储 算法 搜索推荐
认知算法(三)
认知算法(三),一起来学习吧。
认知算法(三)
|
算法 JavaScript 前端开发
认知算法(九)
认知算法(九),一起来学习吧。
|
存储 算法 搜索推荐
认知算法(六)
认知算法(六),一起来学习吧。
认知算法(二)
认知算法(二),一起来学习吧。
|
机器学习/深度学习 算法 搜索推荐
认知算法(一)
认识算法(一),一起来学习吧。
|
算法 搜索推荐
认知算法(五)
认知算法(五),一起来学习吧。
|
算法 搜索推荐
认知算法(十)
认知算法(十),一起来学习吧。
|
机器学习/深度学习 存储 算法
认知算法(四)
认知算法(四),一起来学习吧。
下一篇
无影云桌面