关于选择排序和插入排序:
在华清学习的第二天,学习了一位数组,主要学习为三种排序排序方式:冒泡排序、选择排序、插入排序
插入排序:
插入排序概念:
首先把数组第一个元素作为一个有序列,然后依次取后面数据进行比较插入,如果符合插入条件,插入位置后面的数组往后移动,把待插入数据插入相应符合的位置。
例如: nums[5]={2-5-1-3-4}(从大到小排序)
第一次:2-作为有序序列,将5与有序序列中元素进行比较,即5与2比较,因为2小于5,所以2数据往后移动一位nums[1]=2,5插入nums[0];得到结果:5-2的有序序列
第二次:1与有序序列{5-2}逐次比较,如果没有符合插入条件,则插入在有序数组末尾,即得到有序序列{5-2-1}
第三次:3与有序序列{5-2-1}逐次比较,根据比较得出3大于2,符合插入条件,序列{2,1}往后移位,3插入原先2的位置,即得到有序序列{5-3-2-1}
…
上面列子与代码无关!
代码请自行分析,多思考!
int main()
{
int nums[10]={12,11,4,7,2,8,9,1,3,2};//乱序数组
int i,j,new;//new表示待插入数据
for(i=1;i<10;i++)
{
new=nums[i];//取待插入数据
for(j=i-1;j>=0;j--)//进入有序序列逐次进行比较
{
if(nums[j]>new)//如果符合条件
{
nums[j+1]=nums[j];//数组移动
nums[j]=new;//插入数据
}
}
}
for(i=0;i<10;i++)
printf("%d-",nums[i]);
}
选择排序:
选择排序概念: 首先取第一个值为基准值,然后依次与后面元素比较,进行选择,如果符合选择条件,则记录数组内数据与下标,再往后面进行选择,最终选择最合适的数据;因为每次符合条件会记录数据与下标,最后选择出的数据与基准数据进行位置交换,依次循环最终得到有序序列。例如:nums[5]={2,1,4,3,5}(从小到大排序)
第一次:选择nums[0],2为基准值,依次与后面数值进行选择比较,1小于2符合条件记录1的下标index=1,基准值变为1,继续选择比较,最后得到1位最终选择值,1与2交换位置,即得到{1,2,4,3,5}
第二次:选择nums[1]为基准值, 注意:经过上一次选择排序,nums[1]为2,依次比较后无符合条件,有序序列为{1,2,4,3,5}进行下一次循环
第三次:选择num[2]=4为基准值,往后进行选择比较,选择出数组3,下标3符合,进行交换位置,得到有序序列{1,2,3,4,5}
…
示例程序
int main()
{
int nums[10]={2,4,6,8,0,1,3,5,7,9};
int i,j,temp,index=0;//temp为基准值,index为基准值下标
for(i=0;i<10;i++)
{
temp=nums[i];//获取基准值
index=i;//获取下标
for(j=i+1;j<10;j++)//循环进行选择比较
{
if(nums[j]<temp)//选择数据
{
temp=nums[j];
index=j;
}
}
//最终选择出的数据进行交换位置
temp=nums[i];
nums[i]=nums[index];
nums[index]=temp;
}
for(i=0;i<10;i++)
printf("%d->",nums[i]);
}
全为自己学习理解分享,如有错请多多指教,必会虚心接受!