第7章 快速排序

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
using namespace std;
void swap(int *a, int i, int j)
{
    int tmp = a[i];
    a[i] = a[j];
    a[j] = tmp;
}
int partition(int *a, int p, int r)
{

    //主元随机化
    srand(time(NULL));
    int num = rand() % (r - p + 1) + p;
    swap(a, num, r);

    int x = a[r], i = p - 1;
    for (int j = p; j < r;++j)
        if (a[j] < x){
            ++i;
            swap(a, i, j);
        }
    swap(a, i + 1, r);
    return i + 1;
}
void quickSort(int *a, int p, int r)
{
    if (p < r){
        int q = partition(a, p, r);
        quickSort(a, p, q - 1);
        quickSort(a, q + 1, r);
    }
}

typedef struct _interval{
    int a, b;
}interval;
void intervalSwap(interval &x, interval &y)
{
    interval tmp = x;
    x = y;
    y = tmp;
}
int max(int a, int b)
{
    return a>b ? a : b;
}
int min(int a, int b)
{
    return a < b ? a : b;
}
void fuzzyPartition(interval *a, int p, int r, int &x, int &y)
{
    interval mid = a[r];
    int i, j;
    i = p - 1;
    j = r + 1;
    for (int k = p; k < j; ++k){
        if (a[k].b < mid.a){
            ++i;
            intervalSwap(a[k], a[i]);
        }
        else if (a[k].a > mid.b){
            --j;
            intervalSwap(a[k], a[j]);
            --k;
        }
        else{
            mid.a = max(mid.a, a[k].a);
            mid.b = min(mid.b, a[k].b);
        }
    }
    x = i;
    y = j;
}
void fuzzyQuickSort(interval *a, int p, int r)
{
    if (p < r){
        int x, y;
        fuzzyPartition(a, p, r, x, y);
        fuzzyQuickSort(a, p, x);
        fuzzyQuickSort(a, y, r);
    }
}
int main()
{
    int a[30];
    srand(time(NULL));
    for (int i = 0; i < 30; ++i)
        a[i] = rand() % 1000;
    quickSort(a, 0, 30 - 1);
    for (int i = 0; i < 30; ++i)
        printf("%d\t", a[i]);

    const int cnt = 5;
    interval r[cnt];
    for (int i = 0; i < cnt; ++i){
        r[i].a = rand() % 100;
        r[i].b = rand() % 1000+100;
    }
    fuzzyQuickSort(r, 0, cnt - 1);
    for (int i = 0; i < cnt; ++i){
        printf("%d\t%d\n", r[i].a, r[i].b);
    }
}

O(n2)  O(nlgn)  O(nlgn)  O(nlgn)

时间: 2024-11-08 20:59:29

第7章 快速排序的相关文章

第七章 快速排序

快速排序最坏情况下时间复杂度是O(n*n),但是它平均时间复杂度是O(N*logn),并且常数因子很小,可实现就地排序,所以被作为内排序的常用排序方法. #include <iostream> using namespace std; void swap(int &i,int &j) { int temp=i; i=j; j=temp; } int partition(int *vector, int low, int high) { int pivotpos=low; int

算法导论 第7章 快速排序

快速排序在最坏情况下的时间复杂度为O(n^2),虽然在最坏情况下运行时间比较差,但是快速排序通常是用于排序的最佳选择,因为其平均性能相当好,期望的运行时间为O(nlgn),且在O(nlgn)的记号中隐含的常数因子很小. 快速排序和合并排序有相似之处,都是需要划分序列,在合并排序中,划分的过程很简单,直接选择元素序列的中间位划分位置,排序是在合并的过程中实现的,所以合并排序的合并过程很重要:相比合并排序,快速排序就没有合并的过程,只有划分,快速排序的划分过程很重要,排序是在划分的过程中实现的. /

算法导论第7章快速排序

快速排序 #include <stdint.h> #include <iostream> // QUICKSORT(A, p, r) // if p < r // q = PARTITION(A, p, r) // QUICKSORT(A, p, q - 1) // QUICKSORT(A, q + 1, r) // To sort an entire array, the initial call is QUICKSORT(A, 1, A.length) // PARTIT

算法导论第七章快速排序

一.快速排序概述 关于快速排序,我之前写过两篇文章,一篇是写VC库中的快排函数,另一篇是写了快排的三种实现方法.现在再一次看算法导论,发现对快速排序又有了些新的认识,总结如下: (1).快速排序最坏情况下的时间复杂度为O(n^2),虽然最坏情况下性能较差,但快排在实际应用中是最佳选择.原因在于:其平均性能较好,为O(nlgn),且O(nlgn)记号中的常数因子较小,而且是稳定排序. (2).快速排序的思想和合并排序一样,即分治.快排排序的分治思想体现在: a.首先从待排序的数中选择一个作为基数,

算法导论 第七章 快速排序(python)

用的最多的排序 平均性能:O(nlogn){随机化nlogn} 原地址排序 稳定性:不稳定 思想:分治 (切分左右) 学习方式:自己在纸上走一遍   def PARTITION(A,p,r): x = A[r] # 锚点 主元{大于它放一边,小于的放另一边} i = p - 1 for j in range(p,r): if A[j] <= x: i += 1 A[i],A[j] = A[j],A[i] A[i+1],A[r] = A[r],A[i+1] return i + 1 def QUI

【算法导论】学习笔记——第7章 快速排序

对于包含n个数的输入数组来说,快速排序是一种最坏情况时间复杂度为theta(n^2)的排序算法.虽然最坏情况时间复杂度很差,但是快速排序通常是实际排序应用中最好的选择,因为它的平均性能非常好,期望时间复杂度是theta(nlgn),而且常数因子非常小,并可进行原址排序.1. 快速排序的描述快速排序可采用分治思想实现.分解:数组A[p..r]被划分为两个(可能为空)子数组A[p..q-1]和A[q+1..r],使得A[p..q-1]中的每一个元素都小于等于A[q],而A[q]也小于等于A[q+1.

第七章——快速排序

快速排序 对于n个数的输入数组来说,快速排序是一种最坏情况时间复杂度为O(n2)的排序算法,虽然最坏情况时间复杂度很差,但是快速排序通常是实际排序中最好的选择,因为它的平均性能非常好:它的期望时间复杂度是O(nlgn),而且O(nlgn)中隐含的常数因子非常小. 1.快速排序的描述 快速排序算法采用的分治算法,因此对一个子数组A[p…r]进行快速排序的三个步骤为: (1)分解:数组A[p...r]被划分为两个(可能为空)子数组A[p...q-1]和A[q+1...r],给定一个枢轴,使得A[p.

算法导论学习笔记——第7章 快速排序

快速排序 1 QUICKSORT(A,p,r) 2 if p<r 3 then q←PARTITION(A,p,r) 4 QUICKSORT(A,p,q-1) 5 QUICKSORT(A,q+1,r) 6 7 PARTITION(A,p,r) 8 x←A[r] 9 i←p-1 10 for j←p to r-1 11 do if A[j]<=x 12 then i←i+1 13 exchange A[i]↔A[j] 14 exchange A[i+1]↔A[r] 15 return i+1 随

算法导论学习笔记 第7章 快速排序

对于包含n个数的输入数组来说,快速排序是一种时间复杂度为O(n^2)的排序算法.虽然最环情况的复杂度高,但是快速排序通常是实际应用排序中最好的选择,因为快排的平均性能非常好:它的期望复杂度是O(nlgn),而且O(nlgn)中的常数因子非常小.另外,快速排序还可以实现原址排序,甚至在虚拟环境中也能很好的工作. 1 快速排序的描述 与归并排序一样,快速排序也使用了分治法的思想,下面是对一个典型的子数组A[p.. r]进行快速排序的分治过长: 分解:数组A[p.. r]被划分为两个(可能为空)子数组