算法第二章上机实践报告

1、实践题目名称:找第k小的数

 

2、问题描述:从n个整数中找到第k小的数并输出

 

3、算法描述:包括四个函数,partition函数进行划分,find函数求位置,swap函数用来交换两个数的位置,以及main主函数

#include<iostream>

#include<bits/stdc++.h>

using namespace std;

 

void swap(int *x,int *y){

int temp;

temp=*x;

*x=*y;

*y=temp;

}

 

int partition(int *a,int left,int right){

int x=rand()%(right-left)+left;//预防最坏取值情况

swap(a[x],a[left]);//并放在最左侧

int y=a[left];

int i=left,j=right;

while(i<j){//将小于x的值换到左边,大于x的值换到右边

while(a[i++]<a[left]&&i<j);

while(a[j--]>a[left]);

if(i>=j) break;

swap(a[i],a[j]);

}

a[left]=a[j];

a[j]=y;

return j;

}

 

int find(int *a,int left,int right,int k){

int p=partition(a,left,right);

if(k<(p-left+1)){

find(a,left,p-1,k);

}

else if(k>(p-left+1)){

find(a,p+1,right,k-(p-left+1));

}

else

return a[p];

}

 

int main(){

int n,k;

cin>>n>>k;

int a[10000];

for(int i=0;i<n;i++){

cin>>a[i];

}

int result=find(a,0,n-1,k);

cout<<result<<endl;

return 0;

}

 

4、算法时间及空间复杂度分析:该算法分为两部分,分治和快速排序,快速排序的时间复杂度为O(nlogn),空间复杂度为O(1),分治将大问题分解成小问题递归求解,可以认为时间复杂度为O(n),空间复杂度为O(n),所以总上所得,该算法的时间复杂度为O(nlogn),空间复杂度为O(n)

 

5、心得体会:通过对该题的思考以及反复纠正错误,对分治法以及快速排序算法有了更深一步的了解,前期由于没有考虑到快速排序的最坏情况下的时间效率,造成时间上超时,反复思考终于找到了最适合的方法。

posted @ 2020-10-03 16:20  ZhangQiii  阅读(123)  评论(0)    收藏  举报