算法第二章上机实践报告
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、心得体会:通过对该题的思考以及反复纠正错误,对分治法以及快速排序算法有了更深一步的了解,前期由于没有考虑到快速排序的最坏情况下的时间效率,造成时间上超时,反复思考终于找到了最适合的方法。

浙公网安备 33010602011771号