使用插入排序法求任意数组中任意个数最小值-c语言

仅供一个记录,注释都在源码中

#include "stdafx.h"
/**
	*依赖插入排序法求
	*找任意数组中的N个最小值的位置
	*array:目标数所在的数组
	*arrLen:目标数组的长度
	*mins:存放结果的数组
	*minLen:想要的最小值个数
	*
**/
void function(int array[],int arrLen,int mins[],int minLen)
{
	for(int a=0;a<minLen;a++)
	{
		mins[a]=-1;//作为还没找到的填充标记
	}	

	//第一步:先取想要最小值的个数,作为当前的临时最小数,存起来
	bool isChangedFlag=false;//决定当前数是直接放到当前位置,还是插入到前面去
	for(int i=0;i<minLen;i++)
	{
		isChangedFlag=false;
		for(int j=0; mins[j]!=-1&&j<minLen;j++)
		{			
			if(array[i]<array[mins[j]])
			{				
				//后面的值依次向后滑动
				for(int n=i;n>j;n--)
				{
					mins[n]=mins[n-1];					
				}
				mins[j]=i;				
				isChangedFlag=true;
				break;			
			}			
		}
			
		if(!isChangedFlag)
		{
			mins[i]=i;//将当前数放入到
		}
		
	}

	//第二步:从第结果个数的后一个数开始比较
	for(int z=(minLen);z<arrLen;z++)
	{
		for(int j=0;j<minLen;j++)
		{			
			if(array[z]<array[mins[j]])
			{				
				//后面的值依次向后滑动
				for(int n=minLen;n>j;n--)
				{
					mins[n]=mins[n-1];					
				}
				mins[j]=z;				
				isChangedFlag=true;
				break;			
			}
			
		}

	}
}

int main(int argc, char* argv[])
{
	//使用演示
	const int minLen=23;//要的个数
	int array[]={1000,450,22,23,67,23,45,32,0,56,78,99,555,432,567,432,1455,2332,34324,4434,34,3434,342};//测试数组
	int mins[minLen];//存放结果的数组(值所在的下标)
	printf("当前的结果表中的值为:\n");		
	function(array,sizeof(array)/sizeof(array[0]),mins,minLen);
	
	///*
		for(int m=0;m<minLen;m++)
		{
			printf("位置%d:值%d	",mins[m]+1,array[mins[m]]);
		}		
	//*/
	getchar();
	return 0;
}


猜你喜欢

转载自blog.csdn.net/zhongheijituan/article/details/79278080
今日推荐