随机快速排序问题

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 10

//p,r为边界,先处理左边再处理右边
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);
    }
}

void Swap(int a[],int left,int right)
{
    int tmp;
    tmp = a[left];
    a[left] = a[right];
    a[right] = tmp;
}

int Partition(int a[],int p,int r)
{
    int i=p,j=r+1;
    //本代码的主元选择的是p到r范围内的最左边的即p下标的数
    int x = a[p];
    while(1)
    {
        //将i和j一个从左,一个从右开始相向而行,使得在相遇之前,i部分都是小于x的数,j部分都是大于x的数。左右找到不匹配的数就互换值。
        while(a[++i]<x && i<r) ;
        while(a[--j]>x) ;
        if(i>=j) break;
        Swap(a,i,j);
    }
    //最后把p和j的下标互换一下就可以保证p到r范围内的数,a[j]左边都是小于a[j],右边都是大于a[j],但不代表左边有序或者右边有序,只是单纯的比a[j]小或大在一边而已
    a[p]=a[j];
    a[j]=x;
    return j;
}
int main()
{
    int a[] = {7,1,5,6,3,8,2,10,9,4};
    int i;
    QuickSort(a,0,MAXSIZE-1);
    for(i=0;i<MAXSIZE;i++)
    {
        printf("%5d",a[i]);
    }
    return 0;
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验报告:随机选择第k小元素问题随机快速排序问题 实验目的: 本实验旨在通过实现随机选择第k小元素算法和随机快速排序算法,掌握算法设计和实现的能力,深入理解随机化算法的思想和应用,掌握时间空间复杂度分析方法。 实验平台: 操作系统:Windows 10 编程语言:C++ 开发环境:Visual Studio 2019 实验内容: 本实验分为两部分,分别是随机选择第k小元素算法和随机快速排序算法。具体实现步骤如下: 1. 随机选择第k小元素算法 (1)数学建模: 给定一个包含n个元素的集合S和一个正整数k,要求找出S中第k小的元素。 (2)数据结构: 使用一维数组存储集合S。 (3)算法描述: 随机选择第k小元素算法的主要思想是利用快速排序算法的划分思想,将S分成两部分,一部分小于选定的元素,一部分大于选定的元素。然后根据划分结果,递归查找第k小的元素所在的部分,直到找到第k小的元素。 具体步骤如下: a. 从S中随机选择一个元素x作为基准元素。 b. 将S分成两个集合Sa和Sb,其中Sa中的元素小于x,Sb中的元素大于等于x。 c. 根据Sa中元素的个数和k的大小关系,递归查找第k小的元素所在的集合。 (4)算法编码: ```c++ #include <iostream> #include <cstdlib> #include <ctime> using namespace std; const int MAXN = 100000; int a[MAXN]; int partition(int l, int r) { int x = a[r]; int i = l - 1; for (int j = l; j < r; j++) { if (a[j] < x) { i++; swap(a[i], a[j]); } } swap(a[i + 1], a[r]); return i + 1; } int randomPartition(int l, int r) { int i = rand() % (r - l + 1) + l; swap(a[r], a[i]); return partition(l, r); } int select(int l, int r, int k) { if (l == r) return a[l]; int q = randomPartition(l, r); int cnt = q - l + 1; if (k == cnt) return a[q]; else if (k < cnt) return select(l, q - 1, k); else return select(q + 1, r, k - cnt); } int main() { srand(time(NULL)); int n, k; cin >> n >> k; for (int i = 0; i < n; i++) { cin >> a[i]; } cout << select(0, n - 1, k) << endl; return 0; } ``` (5)时间空间复杂度分析: 时间复杂度为O(n),空间复杂度为O(1)。 2. 随机快速排序算法 (1)数学建模: 给定一个包含n个元素的集合S,要求将S按照升序排列。 (2)数据结构: 使用一维数组存储集合S。 (3)算法描述: 随机快速排序算法的主要思想是利用快速排序算法的划分思想,将S分成两部分,一部分小于选定的元素,一部分大于等于选定的元素。然后根据划分结果,递归对两部分进行排序,直到整个序列有序。 具体步骤如下: a. 从S中随机选择一个元素x作为基准元素。 b. 将S分成两个集合Sa和Sb,其中Sa中的元素小于x,Sb中的元素大于等于x。 c. 递归对Sa和Sb进行排序。 (4)算法编码: ```c++ #include <iostream> #include <cstdlib> #include <ctime> using namespace std; const int MAXN = 100000; int a[MAXN]; int partition(int l, int r) { int x = a[r]; int i = l - 1; for (int j = l; j < r; j++) { if (a[j] < x) { i++; swap(a[i], a[j]); } } swap(a[i + 1], a[r]); return i + 1; } int randomPartition(int l, int r) { int i = rand() % (r - l + 1) + l; swap(a[r], a[i]); return partition(l, r); } void quickSort(int l, int r) { if (l < r) { int q = randomPartition(l, r); quickSort(l, q - 1); quickSort(q + 1, r); } } int main() { srand(time(NULL)); int n; cin >> n; for (int i = 0; i < n; i++) { cin >> a[i]; } quickSort(0, n - 1); for (int i = 0; i < n; i++) { cout << a[i] << " "; } cout << endl; return 0; } ``` (5)时间空间复杂度分析: 时间复杂度为O(nlogn),空间复杂度为O(logn)。 结论: 本实验成功实现了随机选择第k小元素算法和随机快速排序算法,分别用于寻找第k小的元素和对一个集合进行排序。通过时间空间复杂度分析,可以看出随机选择第k小元素算法的时间复杂度为O(n),空间复杂度为O(1),随机快速排序算法的时间复杂度为O(nlogn),空间复杂度为O(logn)。在实际应用中,根据具体问题的要求,可以选择不同的算法进行求解。 优化改进: 在实际应用中,可以通过多次随机选择基准元素的方法,减少快速排序算法的最坏时间复杂度。此外,还可以使用插入排序等算法对小规模问题进行求解,提高算法的效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值