【算法导论】选择排序法

选择排序法

         选择排序其实是冒泡法的一种改进, 其基本思路也是:先确定最小元素,再找次最小元素,最后确定最大元素。
        它与冒泡排序的 最大区别在于:冒泡排序是只要碰见比它大的元素就交换,而选择排序是直接将元素放在最终的确定位置,从而避免了多次交换过程。
         举例说明:数组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



你可能感兴趣的:(C++,c,算法,排序)