选择排序法、冒泡排序法

选择排序法

int main(int argc, char *argv[])
{
	int i, j, iMin;
	int tmp;
	int nNums[10] = {2,123,541,32,12,74,92,50,8,21};

	for(i=0;i<10-1;i++)
	{
		iMin = i;    //提取数据的每个位置
		for(j=i+1;j<10;j++)  //每次循环,通过iMin获取最小值的下标。
		{
			if(nNums[iMin]>nNums[j])   //判断是否最小,比imin。后面的数就同imin这个数进行比较
				iMin = j;
		}
		if(iMin != i)   //当iMin不等i的时候,我们交换值。等于i我们就没有必要交换
		{
			tmp = nNums[i];
			nNums[i] = nNums[iMin];
			nNums[iMin] = tmp;
		}
	}

	return 0;
}

通过以下图来分析

选择排序法、冒泡排序法_第1张图片

这里外层循环中,每次循环都取得一个排序的位置。

然后内层循环比较判断出数组的最小数。在把最小数填充到外层的排序位置中

————————————————————————————————————

冒泡排序法

int main(int argc, char *argv[])
{
	int i, j;
	int tmp;
	int nNums[10] = {2,123,541,32,12,74,92,50,8,21};

	for(i=0;i<10-1;i++)  //控制循环次数
	{
		for(j=0;j<10-i-1;j++)//内层循环,相应的两两数进行比较
		{
			if(nNums[j]>nNums[j+1])//比较交换数据
			{
				tmp = nNums[i];
				nNums[i] = nNums[iMin];
				nNums[iMin] = tmp;
			}
		}
	}

	for(i=0;i<10;i++)
		printf("%d ",nNums[i]);
	system("pause");
	return 0;
}

原理如下图:

选择排序法、冒泡排序法_第2张图片

其中内层循环中,每次循环都把1个给比较到最后。那我们在内层循环的时候就可以少循环i次

所以内层循环 for(j=0;j<10-i-1;j++)  循环这么多次

你可能感兴趣的:(选择排序法、冒泡排序法)