仅供一个记录,注释都在源码中
#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;
}