开发者社区> tengweitw> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

【算法导论】选择排序法

简介: 选择排序法         选择排序其实是冒泡法的一种改进,其基本思路也是:先确定最小元素,再找次最小元素,最后确定最大元素。         它与冒泡排序的最大区别在于:冒泡排序是只要碰见比它大的元素就交换,而选择排序是直接将元素放在最终的确定位置,从而避免了多次交换过程。
+关注继续查看

选择排序法

        选择排序其实是冒泡法的一种改进,其基本思路也是:先确定最小元素,再找次最小元素,最后确定最大元素。
        它与冒泡排序的最大区别在于:冒泡排序是只要碰见比它大的元素就交换,而选择排序是直接将元素放在最终的确定位置,从而避免了多次交换过程。
        举例说明:数组a[5]={3,4,2,5,1}.通过一轮比较知1应当放在数组a[0]上。所以我们可以直接将a[0]与a[4]进行交换,从而避免了a[4]在比较过程中与其它元素的交换。在中间比较时,不需要记录值,只需要记住索引就可找到元素。
   具体程序如下:
#include<stdio.h>
void SelectSort(int* arrayA,int n);

void main()
{
	int arrayA[]={4,2,3,6,3,8,5};
	int n=sizeof(arrayA)/sizeof(int);
	SelectSort(arrayA,n);
	
	for(int i=0;i<n;i++)
		printf("%d ",arrayA[i]);
	printf("\n");
}

void SelectSort(int* arrayA,int n)
{
	for(int i=0;i<n-1;i++)
	{
		int index=i;
		for(int j=i+1;j<n;j++)//注意j从i+1开始,因为前面的元素已经排好了
		{
			if(arrayA[j]<arrayA[index])
				index=j;//只需要记录索引值
		}

		//如果当前最小数据索引不是i,也就是说排在i位置的数据在index处
        if (index!=i)        
        {
            //交换数据,确定i位置的数据。
            int temp = arrayA[i];
            arrayA[i] = arrayA[index];
            arrayA[index] = temp;
        }
	}
}

注意:我是在vs2008上运行的,与vc 6.0有点区别,主要是循环体中的循环变量的作用域,出错体现在循环变量的重复定义上。例如:在vs2008或vs2010上,程序为:

#include<stdio.h>
void main()
{
int i=0;
for(int i=0;i<5;i++)
printf("%d ",i);
}

则在VC 6.0上需改为:

#include<stdio.h>
void main()
{
int i=0;
for(i=0;i<5;i++)
printf("%d ",i);
} 


原文:http://blog.csdn.net/tengweitw/article/details/9707801

作者:nineheadedbird



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【算法导论】二分查找
1. 描述(查找算法):   输入:n个数的一个序列 A = (a1, a2, a3,.....an)和一个值v   输出:下表 i 使得 v=A[i] 或者 v 不在A中出现时,输出 NIL   二分查找的前提是A必须是有序序列, 以下全部假设是A是非降序序列 2.
790 0
【算法导论】插入排序
没办法就是这么没原则,又开了个坑。每天看点书,不管什么书。 1. 需求:   输入:n个数的一个序列(a1, a2,  a3……an)   输出: 输出序列的一个排列(a1', a2', a3' ……an'),满足a1'
961 0
《算法导论(原书第3版)》一2.1 插入排序
本节书摘来自华章出版社《算法导论(原书第3版)》一 书中的第2章,第2.1节,作者:(美)Thomas H.Cormen,Charles E.Leiserson,Ronald L.Rivest,Clifford Stein,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1089 0
【算法导论】冒泡排序法
冒泡排序法 时间复杂度:O(n*n) 基本思想:从数组最后一个元素开始,依次与前一个元素比较,若比前一个元素小,则与之交换位置,然后再与当前前一个元素比较,直到遇到比它大的元素为止。
1172 0
【算法导论】桶排序
桶排序 时间复杂度为:O(n) 基本思想:将要排列的序列分成n组,每组分别进行排序,然后在合并到一起,这里面有分而治之的思想。实例说明:大家学c语言肯定学过switch-case结构,最常见的题型就是对成绩进行分类,但是这里我们是对其进行排名。
857 0
【算法导论】基数排序
基数排序 时间复杂度:O(n). 基本思路:两个数比较大小,我们的直观感觉是先比较高位,若相同则比较低位。但是这样做需要记录额外的数据,浪费空间。
644 0
【算法导论】计数排序
计数排序 比较排序:通过元素间的比较对序列进行排序的算法称为比较排序。 常见的比较排序算法有:冒泡排序法、插入排序法、合并排序法、快速排序法,堆排序法等等。
802 0
【算法导论】合并排序法
       分治法:将原问题划分为n个规模较小而结构与原问题相似的子问题;递归地解决这些子问题,然后再合并其结果,就得到了原问题的解。分治法在每一个递归上都有三个步骤:分解、解决、合并。
640 0
【算法导论】插入排序法
插入排序法的时间复杂度为n的平方,对于较小的输入规模来说,插入排序法比合并排序法更快些。在最佳情况下,即输入数组已经排序好,则时间复杂度可表示为n,是一个线性函数;在最差情况下,即输入数组是逆序排列时,时间复杂度为.
750 0
+关注
tengweitw
所在学校:西电 兴趣爱好:编程、英语,象棋,乒乓球 email:771257840@qq.com
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载