实例要求
1.定义两个长度为100的数组A和B
2.用户分别输入两个数组的长度m,n (m+n)<100
3.分别按照长度输入A和B的值
4.对A和B进行排序 打印排序结果
5.定义的长度为100的数组C
6.把数组A和B 有序的插入的数组C中
7.要求一边插入一边考虑排序!!!!
需要弄清的知识点
1.数组的定义方式
2.如何产生并打印数组元素
3.增删改查插入的基本知识
4.基本的排序算法:选择排序和冒泡排序
选择排序:
假设有一个数组arrayA[5]
数组元素下标0,1,2,3,4
对应数组元素3,5,1,9,7
假定每次进行排序的第一个下标的元素3为整个数组最小值,找剩余四个数组最小元素的下标,如果剩下元素的最小值比假定的要小,双方就交换元素。
例如:3为假定最小值,5,1,9,7最小值为1,对应下标为2,1比3小,所以交换结果为1,5,3,9,7此时1就是最小的,再在剩下四个元素用选择排序,以此类推到最后一个元素
//arrayA[100]={0};
//用户输入的元素个数为a
for (int i = 0; i < a ; i++)//这一行的循环条件要想清楚
{
minPos = i;//假设第一个元素是最小值并记录下标
for (int j = i + 1; j < a; j++)//在剩下元素里找比他(假设的最小值)更小的元素的下标
{
if (arrayA[minPos] > arrayA[j]) //这一行的minPos为什么不能写成i?因为最小下标一直在变化
{
minPos = j;
}
}
//交换算法
int temp = arrayA[i];
arrayA[i] = arrayA[minPos];
arrayA[minPos] = temp;
}
冒泡排序:跟鱼吐泡泡一样
假设:
10
9
8
7
从7开始两两比较往上冒泡,第一次10,9,7,8 第二次10,7,9,8,第三次7,10,9,8,第一次冒泡完成,依次类推,注意下一次冒泡的次数是上一次冒泡次数-1,因为最小的元素不需要冒泡,可以进行优化。
以下为代码:
//
//arrayA[100]={0};
//用户输入的元素个数为a
for (int i = 0; i < a; i++)
{
for (int j = 0; j < a; j++)
{
if (arrayA[i] < arrayA[j])
{
int temp = arrayA[i];
arrayA[i] = arrayA[j];
arrayA[j] = temp;
}
}
}
下面是完整代码,VS2017,内有注释,若有不足的地方请读者斧正,仅供交流学习。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
/*
1.定义两个长度为100的数组A和B
2.用户分别输入两个数组的长度m,n (m+n)<100
3.分别按照长度输入A和B的值
4.对A和B进行排序 打印排序结果
5.定义的长度为100的数组C
6.把数组A和B 有序的插入的数组C中
要求一边插入一边考虑排序!!!!
*/
int main()
{
int a, b;
int arrayA[100] = {
0 };
int arrayB[100] = {
0 };
int arrayC[100] = {
0 };
printf("请输入A数组元素个数:\n");
scanf("%d", &a);
printf("请输入B数组元素个数:\n");
scanf("%d", &b);
while (a + b <= 100)
{
printf("请输入A数组的元素:\n");
for (int i = 0; i < a; i++)
{
scanf("%d", &arrayA[i]);
}
printf("A数组的元素为:\n");
for (int i = 0; i < a; i++)
{
printf("%d\t", arrayA[i]);
}
printf("\n");
printf("请输入B数组的元素:\n");
for (int j = 0; j < b; j++)
{
scanf("%d", &arrayB[j]);
}
printf("B数组的元素为:\n");
for (int j = 0; j < b; j++)
{
printf("%d\t", arrayB[j]);
}
printf("\n");
//以下为冒泡排序
/*
for (int i = 0; i < a; i++)
{
for (int j = 0; j < a; j++)
{
if (arrayA[i] < arrayA[j])
{
int temp = arrayA[i];
arrayA[i] = arrayA[j];
arrayA[j] = temp;
}
}
}
*/
//以下是选择排序过程
int minPos = 0;
for (int i = 0; i < a ; i++)//这一行的循环条件要想清楚
{
minPos = i;//假设第一个元素是最小值
for (int j = i + 1; j < a; j++)//在剩下元素里找比他(假设的最小值)更小的元素的下标
{
if (arrayA[minPos] > arrayA[j]) //这一行的minPos为什么不能写成i?因为最小下标一直在变化
{
minPos = j;
}
}
int temp = arrayA[i];
arrayA[i] = arrayA[minPos];
arrayA[minPos] = temp;
}
printf("排序后的A数组为:\n");
for (int j = 0; j < a; j++)
{
printf("%d\t", arrayA[j]);
}
printf("\n");
int minPos2 = 0;
for (int i = 0; i < b; i++)//这一行的循环条件要想清楚
{
minPos2 = i;
for (int j = i + 1; j < b; j++)
{
if (arrayB[minPos2] > arrayB[j])
{
minPos2 = j;
}
}
int temp2 = arrayB[i];
arrayB[i] = arrayB[minPos2];
arrayB[minPos2] = temp2;
}
printf("\n");
printf("排序后的B数组为:\n");
for (int j = 0; j < b; j++)
{
printf("%d\t", arrayB[j]);
}
printf("\n");
//下面进行插入操作,将B数组的元素插入并判断大小
for (int i = 0; i < a; i++)
{
arrayC[i] = arrayA[i];
}
int size = a;//动态的数组元素下标
for (int i = 0; i < b; i++)//从B数组第一个元素开始插入
{
int j = 0;
for (; j < size; j++)
{
if(arrayC[j] > arrayB[i])
{
for (int k = size; k > j; k--)//这个地方size为啥不能写a?因为size随着插入数据数目而变化,而a固定
{
arrayC[k] = arrayC[k - 1];
}
arrayC[j] = arrayB[i];
size++;
break;//必须要有,不然每一次做插入都满足条件,陷入死循环
}
}
if (j == size)//当找到最后一个元素都不到合适的插入位置的时候就说明这个是最大的,放在最后面
{
arrayC[j] = arrayB[i];
size++;
}
}
printf("两数组插入排序后结果:\n");
for (int i = 0; i < size; i++)
{
printf("%d\t", arrayC[i]);
}
printf("\n");
}
system("pause");
return 0;
}
实现效果: