//冒泡排序
//外层循环
//当i=0时 从j从1-->N进行变化
//当i=1时 从j从2-->N进行变化
//当i=2时 从j从3-->N进行变化
//........
//外层循环
//当i=0时 从j从1-->N进行变化
//当i=1时 从j从2-->N进行变化
//当i=2时 从j从3-->N进行变化
//........
//结论: 摁着一个变量i不变 让另外一个变量j进行轮循 那个不变的数组地址用来放最小的数值 下一轮依次进行
// 也就是谁小谁放到那个a[i]上面
// 也就是谁小谁放到那个a[i]上面
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
//排序
void main21()
{
int i = 0, j = 0;
int tmp = 0;
int a[] = {522,200,350,4,8,9,12};
printf("排序之前:");
for (i = 0; i < 7; ++i)
{
printf("%d ",a[i]);
}
for (i = 0; i < 7; i++)//外层:比较多少趟 n-1躺
{
for (j = i + 1; j < 7; j++)//内层比较 找到一个最小的
{
if (a[i] > a[j])//两个地址上的数值对比 成立 两个地址交换数值
{
tmp = a[i]; //a[i]的地址永远用来放最小的数
a[i] = a[j];
a[j] = tmp;
}
//每循环一次 对应的a[i]地址都放好了最小的数值
}
}
printf("排序之后:");
for (i = 0; i < 7; ++i)
{
printf("%d ", a[i]);
}
printf("hello...\n");
system("pause");
}
//数组做参数的退化问题 会退回一个指针
//结论:1.把数组的首地址和有效长度传给被调用函数
// 2.实参a和形参a的数据类型的本质不一样
// 形参中的数组 编译器会把他当成指针处理 只是c的特色
// 3.形参写在函数括号内和写在函数内是一样的 只不过前者有对外的属性而已
//结论:1.把数组的首地址和有效长度传给被调用函数
// 2.实参a和形参a的数据类型的本质不一样
// 形参中的数组 编译器会把他当成指针处理 只是c的特色
// 3.形参写在函数括号内和写在函数内是一样的 只不过前者有对外的属性而已
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
oid printArray(int a[],int num)//作为形参的数组在编译器看了不过就是指向该数组首元素的指针
{
int i = 0;
for (i = 0; i < num; ++i)
{
printf("%d ", a[i]);
}
}
//void sortArray(int a[],int num)
void sortArray(int *a, int num)
{
/*int num2;
num2 = sizeof(a) / sizeof(a[0]); //计算的是这个指针的长度 并不是数组的长度
printf("%d",num2); */ //num2的结果并不是数组的长度 而是为1 证明了传进来的并不是数组 而是指向数组首元素的指针
int i = 0, j = 0;
int tmp = 0;
for (i = 0; i < num; i++)
{
for (j = i + 1; j < num; j++)
{
if (a[i] > a[j])
{
tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}
}
}
void main()
{
int num;
int a[] = { 522, 200, 350, 4, 8, 9, 12 };
num = sizeof(a)/sizeof(a[0]);
printf("排序之前:");
printArray(a,num);
sortArray(a,num);
printf("排序之后:");
printArray(a,num);
printf("hello...\n");
system("pause");
}