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

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

看到的朋友共勉!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值