算法导论第八章思考题-c++

来源:互联网 发布:淘宝开了店铺搜索不到 编辑:程序博客网 时间:2024/06/05 13:28

8-2.e 线性时间的原址排序

#include "stdafx.h"#include <stdio.h>#include <iostream>#include <string>#include <math.h>#include <time.h>using namespace std;void sort_WithLinerCost_InOriginPlace(int a[],int n,int k)//所有的元素都属于1到k{int *c = new int[k+1];int *p = new int[k+1];for(int i=0;i<=k;i++){c[i] = 0;p[i] = 0;}for(int i=0;i<n;i++){c[a[i]] ++;p[a[i]] ++;}for(int i=2;i<=k;i++){c[i] += c[i-1];p[i] += p[i-1];}int j = 0;p[0] = -1;while(j<n){//这个元素已经放到了合适的位置  则直接跳过    //  由于a[j] 属于1到k  所以当a[j] == 1的时候 p[a[j]-1] = -1 这个时候必然满足 j>p[a[j]-1]//所以不用再对a[j] =1的时候进行特殊判断if(j>(p[a[j]-1]-1) && j <= (p[a[j]]-1))j++;else{ int temp = a[c[a[j]]-1];a[c[a[j]]-1] = a[j];c[a[j]] --;a[j] = temp;}}}int main(){char s;do{int N = 10;int *a = new int[N];//int a[10]= {1,4,5,6,4,2,7,4,8,4};//int a[10] = {   8   , 8   , 9 ,   5  ,  9 ,   9,    5,    4,    3,    2};srand(time(0));for(int i=0;i<N;i++){a[i] = rand()%N+1;printf("%5d",a[i] );}   cout<<endl;long long begin = clock();sort_WithLinerCost_InOriginPlace(a,N,N);long long end = clock();cout<<"time:"<<(end-begin)/(float)CLOCKS_PER_SEC*1000<<"ms"<<endl;for(int i=0;i<N;i++)printf("%5d",a[i] );cout<<endl;cin>>s;}while(s == 'y' || s == 'Y');return 0;}

推荐文章:

http://blog.csdn.net/z84616995z/article/details/18559785

比较全,在这篇文章下面我也添加了一些自己的思路。

不知不觉,已经过了4点,果然深夜容易集中注意力,略感疲乏。终于过上了完全自由的做自己想做的事的日子,习惯并享受独处。没有一种日子是轻松的,但是很充实,我喜欢。晚睡晚起,晚安!

看到的朋友共勉!

0 0
原创粉丝点击