#include <stdio.h>
/*
* 实参传指针型形参时, 传入实参的地址,
* 对指针形参所指的实参地址中的内容进行修改,
* 指针形参虽释放,但实参地址中的值改变。
*/
/*
**temp指针变量是未知存储单元不可赋值
*C语言中实参变量单向传递给形参变量
*形参值的改变不能使实参的值随之改变。
*/
void swap(int *a, int *b)
{
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
void print_array(int *v, int len)//打印一维数组
{
int i;
for (i = 0; i < len; i++)
{
printf("%d ", v[i]);
}
printf("\n");
}
void bubble_sort(int *v, int len)//冒泡排序(确定顺序后可提前跳出循环进行优化)
{
int i;
int j;
int times = 0;//记录循环次数
for (i = 0; i < len - 1; i++)
{
for (j = 0; j < len - 1 - i; j++)//(len - 1)注意越界
{
if (v[j] > v[j + 1])
{
//swap(&v[j], &v[j + 1]);
swap(v + j, v + j + 1);//指针P+1 = 指针P + sizeof(指针的类型)* 1
}
times++;
}
print_array(v, len);
}
printf("%d\n", times);
}
void select_sort(int *v, int len)//选择排序
{
int max_value;
int max_pos;
int i;
int j;
for (i = 0; i < len - 1; i++)//控制循环次数,9个数循环8次
{
max_value = v[0];//先将第一个数默认为最大的数与后面进行比较
max_pos = 0;//标记最大值位置与最后一个元素进行交换
for (j = 1; j < len - i; j++)//第一个值被使用,i的作用是不让最后一个数参与比较
{
if (v[j] > max_value)
{
max_value = v[j];
max_pos = j;
}
}
swap(v + max_pos, v + len - i - 1);//将最大值放最后,(len - i - 1)是最大值的下标
print_array(v, len);
}
}
void insert_sort1(int *v, int len)//插入排序考试版
{
int i;
int j;
int value;//取插入的值
for (i = 1; i < len; i++)//从a[1]开始,末尾结束
{
value = v[i];
for(j = i; j > 0 && value < v[j-1]; j--)//&&左右顺序搞反会导致j=0时越界
{
v[j] = v[j-1];
}
v[j] = value;
print_array(v, len);
}
}
void insert_sort2(int *v, int len)//插入排序正常逻辑版
{
int i;
int j;
int value;
for (i = 1; i < len; i++)
{
value = v[i];
for(j = i; j > 0; j--)
{
if (value > v[j - 1])
{
break;
}
v[j] = v[j-1];
}
v[j] = value;
print_array(v, len);
}
}
int main()
{
int a[] = {1,21,15,42,27,83,19,110,-111};
int len = sizeof(a) / sizeof(a[0]);//36Byte/4Byte求出数组成员个数
print_array(a, len);
bubble_sort(a, len);
print_array(a, len);
return 0;
}
1、 bubble_sort运行结果
2、select_sort运行结果
3、insert_sort运行结果