欢迎提出更优化建议
算法设计课程记录
#include
void sort1(int *a);//选择排序
void sort2(int *a);//插入排序
void sort3(int *a);//冒泡排序
void swap(int *a, int n, int m);//将数组中第m位与第n位交换位置
void sort1(int *a)
{
printf("选择排序:\n");
int i,j,k;
int com = 0;//比较
int sw = 0;//交换
for (i = 0; i < 7; i++)
{
k = i;
for (j = i + 1; j < 8; j++)
{
com++;
if (a[k] > a[j]) k = j;
}
swap(a, i, k); sw++;
printf("%d,%d,%d,%d,%d,%d,%d,%d\n", a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]);
}
printf("比较次数为:%d\n交换次数为:%d\n", com, sw);
}
void sort2(int *a)
{
printf("插入排序:\n");
int i, j,key;
int com = 0;
int cover = 0;
for (i = 1; i < 8 ; i++)
{
key = a[i];
for (j = i - 1; j >= 0; j--)
{
com++;
if (a[j] > key) { a[j + 1] = a[j]; cover++; }
else { break; }
}
a[j + 1] = key; cover++;
printf("%d,%d,%d,%d,%d,%d,%d,%d\n", a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]);
}
printf("比较次数为:%d\n覆盖次数为:%d\n", com, cover);
}
void sort3(int *a)
{
printf("冒泡排序:\n");
int i, j, flag;//当一趟循环中没有进行swap,要退出整个循环
int com = 0;
int sw = 0;
for (i = 0; i < 8; i++)
{
int flag = 0;
for (j = 0; j < 7 - i; j++)
{
com++;
if (a[j] > a[j + 1]) { swap(a, j, j + 1); sw++; flag = 1; }
}
if (flag != 1) break;
printf("%d,%d,%d,%d,%d,%d,%d,%d\n", a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]);
}
printf("比较次数为:%d\n交换次数为:%d\n", com, sw);
}
void swap(int *a, int n, int m)//将数组中第m位与第n位交换位置
{
int b = a[n];
a[n] = a[m];
a[m] = b;
}
int main()
{
int i, a[8];
printf("请输入8个数字:");
for (i = 0; i < 8; i++)
{
scanf_s("%d", &a[i]);
}
printf("\n排序过程为:\n");
sort2(a);
printf("\n排序结果为:");
for (int i = 0; i < 8; i++)
{
printf("%d ", a[i]);
}
}