`
CalvinMnakor
  • 浏览: 52086 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

《编程珠玑》第十一章 排序

阅读更多
好久没写博客了,最近挺忙的,忙的不可开交,可细想一下,又都是在瞎忙,浑浑噩噩的,不知自己到底忙什么,又到底有什么收获。扪心自问,自己浪费了不少时间。不管怎样,自己要把握好,有志者就要时时刻刻约束自己的行为,我要这样严格要求自己,不管别人怎么看待,也不管自己有多痛苦,坚持下去。当然,写博客也是一样,强迫自己每天学点知识,做好总结,同样也做好以后的规划。
好了,废话少说,今天看看了好久未看的《编程珠玑》,是11章,关于排序的,都是很熟悉的东西。下边把我写点的一些关于排序的程序贴上,算术自己的一个小总结;
void Initialization(int *c)
{
	//produce a sequence unsorted
    for(int i = 0;i < N;i ++)
		c[i] = rand()%N;
  
}
void Display(int *c)
{
	//display the current sequence
	for(int i = 0;i < N;i ++)
		cout<<c[i]<<" ";
	cout<<endl;
}
/*Select Sort*/
void SelectSort(int *c,int n)
{
	/*find the smaller to the left half in the current right half*/
	int tmp;
	for(int i=0;i < n-1;i ++)
		for(int j=i+1;j < n;j ++)
			if (c[j] < c[i])
			{
				//put the smaller one to left
				tmp = c[i];
				c[i] = c[j];
				c[j] = tmp;
			}
}
/*Insert Sort*/
void InsertSort(int *c,int n)
{
	//n numbers
	int i,j,tmp;
	for(i = 1;i < n;++ i)
	{
		//sort the c[i]
        tmp = c[i];
		for(j = i;j > 0&&c[j-1] > tmp;-- j)
			//move the bigger ones right
			c[j] = c[j-1];
		c[j] = tmp;
	}
}
void QuickSort(int * c,int l,int u)
{
	//quick sort---Version 1
	if (l >= u) return;
	int m = l;
	int tmp;
	for (int i = l+1;i <= u;i ++)
		if (c[i] < c[l])
		{
			//swap c[++m] c[i]
            tmp = c[++m];
			c[m] = c[i];
			c[i] = tmp;
		}
	Display(c);
	/*put c[l] in the middle*/
	tmp = c[l];
	c[l] = c[m];
	c[m] = tmp;
    /*quick sort the left and right ones*/
	QuickSort(c,l,m-1);
	QuickSort(c,m+1,u);
}
void _QuickSort(int *c,int l,int u)
{
	//improve the above algorithm while all the elements are the same
	if (l >= u) return;
	int t,i,j,tmp;
	t = c[l];
	i = l+1;
	j = u;
	while (true)
	{
		while(i < u && c[i] <= t) ++ i; cout<<i<<endl;
		while (c[j] > t) -- j; cout<<j<<endl;
		if (i >= j) break;
		/*swap the small and big ones*/
        tmp = c[i];
		c[i] = c[j];
		c[j] = tmp;
		Display(c);
	}
	/*put c[l] in the middle*/
	tmp = c[j];
	c[j] = c[l];
	c[l] = tmp;
	/*sort the left and right ones*/
	Display(c);
	_QuickSort(c,l,j-1);
	_QuickSort(c,j+1,u);
}

int get_k_smaller(int *c,int l,int u,int k)
{
	//get the k smallest number
    //if(l >= u) return;
	int t = c[l];
	int i,j,tmp;
	i = l+1;j=u;
	while(true)
	{
		//cut it to two pieces
		while(i < u&&c[i] <= t) ++ i;
		while(c[j] > t) -- j;
		if (i >= j) break;/*swap all the datas*/
		//swap the smaller one and the bigger one
        tmp = c[i];
		c[i] = c[j];
		c[j] = tmp;
	}
	/*put the c[l] int the middle*/
	tmp = c[l];
	c[l] = c[j];
	c[j] = tmp;
	/*from c[l+1] to c[j] is smaller than t*/
	if (j-l+1 == k)                          /*the same numbers which is k*/
		return c[j];
	else if (j-l+1 > k)                      /*the numbers that small than c[l] is more than k*/
		 get_k_smaller(c,l,j-1,k);           /*find the k_smaller in the smaller piece*/
	else get_k_smaller(c,j+1,u,k-j+l-1);     /*find the last number without the before (j-l+1)s in the smaller one*/
}

/*Shell Sort*/
void ShellSort(int *c,int n)
{
	//
	int h,tmp;
	for(h = 0; h < n;h = 3*h + 1)
		;
	while (1)
	{
        h /= 3;
		cout<<"h:"<<h<<endl;
		if (h < 1) break;
		for (int i = h;i < n;++ i)
			for(int j = i;j >= h;j -= h)
			{
				if (c[j-h] < c[j]) break;
				//swap
                tmp = c[j-h];
				c[j-h] = c[j];
				c[j] = tmp;
				cout<<i<<" "<<j<<endl;
				Display(c);
			}
	}
}
分享到:
评论
1 楼 CalvinMnakor 2010-06-14  

相关推荐

    编程珠玑.pdf

    第11章 图形化输出 103 11.1 实例研究 103 11.2 显示结果取样 105 11.3 原理 107 11.4 习题 108 11.5 深入阅读 110 11.6 拿破仑远征莫斯科(边栏) 110 第12章 对调查的研究 113 12.1 有关民意调查的问题 113 12.2 ...

    编程珠玑 第二版 修订版

    第11章 排序 109 11.1 插入排序 109 11.2 一种简单的快速排序 110 11.3 更好的几种快速排序 113 11.4 原理 115 11.5 习题 116 11.6 深入阅读 117 第12章 取样问题 119 12.1 问题 119 12.2 一种解决方案 ...

    《编程珠玑》(Programming Pearls)课本和习题代码实现

    5. **column11.cpp**: 第十一章可能涵盖了数据压缩和编码技术,如霍夫曼编码(Huffman Coding)或LZW编码,这些都是处理大量数据的有效手段。 6. **column12.cpp**: 第十二章可能涉及到错误检测和纠正,比如奇偶...

    编程珠玑第2版源代码

    4. **Column 2, Column 13, Column 11, Column 9, Column 14, Column 15, Column 5**:这些文件分别对应书中的第二、第十三、第十一、第九、第十四、第十五和第五个栏目。每个栏目可能涉及不同的编程挑战和解决方案...

    编程珠玑-英文版+中文版+source code

    《编程珠玑》是计算机科学领域的一本经典之作,由Jon Bentley 编著,它以其深入浅出的方式探讨了程序设计中的许多核心问题。这本书主要关注如何有效地处理和存储大量数据,以及如何在时间和空间效率之间找到平衡。...

    编程珠玑(第二版)中文版

    - **第十一章至第十三章:数值计算**:讲解了数值计算中常见的误差来源及处理方法,并给出了实例演示。 - **第十四章至第十六章:高级主题**:这部分内容更加深入,涉及并行计算、大规模数据处理等领域。 综上所述...

    (编程珠玑第二版

    《编程珠玑第二版中英资源》这个压缩包可能包含了这本书的中文和英文版,对于想要深入学习编程理念和技术的读者来说,是一份宝贵的资料。通过阅读和理解这些内容,可以提升编程技能,更好地应对实际工作中的挑战。

    编程珠玑(第2版·修订版)1

    第11章“排序”详细讨论了各种排序算法,如插入排序和快速排序。第12章“取样问题”展示了如何设计解决方案来解决特定问题。第13章“搜索”涵盖了不同类型的搜索结构,如线性结构和二分搜索树。第14章“堆”解释了堆...

    编程珠玑源代码

    算法,第3章 数据决定程序结构,第4章 编写正确的程序,第5章 编程小事,第6章 程序性能分析,第7章 粗略估算,第8章 算法设计技术,第9章 代码调优,第10章 节省空间,第11章 排序,第12章 取样问题,第...

    算法分析 课后问题解答

    例如,第九章可能探讨了排序算法的效率和比较,第十一章可能涉及了搜索算法和数据结构的优化,而第十三章可能讨论了动态规划或者递归问题。每章后的习题则是检验读者理解和应用这些概念的关键。 深入分析部分,不仅...

    第十九届全国青少年信息学奥林匹克联赛(嘉兴赛区)迎考材料.rar

    这份"第十九届全国青少年信息学奥林匹克联赛(嘉兴赛区)迎考材料"的压缩包文件,无疑是参赛学生准备比赛的重要参考资料。 首先,信息学奥林匹克联赛的考核内容通常包括算法设计、数据结构、计算机科学基础理论等。...

    Algorithm Perl

    15. **编程珠玑**:《Programming.Pearls.pdf》这本书通常包含一系列关于编程技巧和最佳实践的文章,对于提升Perl编程技能和算法理解大有裨益。 通过深入学习和实践《Algorithm Perl》中的内容,开发者可以掌握Perl...

Global site tag (gtag.js) - Google Analytics