法一:二维数组
创建2行20列的数组,一组存次序,一组数值
进行冒泡排序,数值交换同时,交换次序。
#include <stdio.h>
#include <string.h>
void sort(int a[][20])
{
int flag, i, j, t;
for (i = 0; i < 20; i++)
{
flag = 1;
for (j = 1; j < 20 - i; j++)
{
if (a[1][j - 1] > a[1][j])
{
t = a[1][j - 1];
a[1][j - 1] = a[1][j];
a[1][j] = t;
t = a[0][j - 1];
a[0][j - 1] = a[0][j];
a[0][j] = t;
flag = 0;
}
}
if (flag)
return;
}
}
int main()
{
int i, a[2][20] = { 0 };
for (i = 0; i < 20; i++)
a[0][i] = i + 1;//第一行存次序
for (i = 0; i < 20; i++)
scanf_s("%d", &a[1][i]);//第二行存数字
sort(a);
for (i = 0; i < 20; i++)
printf("%2d ", a[1][i]);
printf("\n");
for (i = 0; i < 20; i++)
printf("%2d ", a[0][i]);
return 0;
}
法二:三数组法
数组a存放数值
数组b拷贝数组a内容
数组c作为标记数组,初始化0,若已匹配到次序,置1
#include<stdio.h>
int main()
{
int a[21], b[21], c[21] = { 0 };
int i, j, k, t, x = 0;
for (i = 1; i < 21; i++)
scanf("%d", &a[i]);
memcpy(b, a, 84);
for (i = 1; i < 20; i++)
{
k = i;
for (j = 1 + i; j < 21; j++)
{
if (a[j] < a[k])
k = j;
}
if (k != i)
{
t = a[k];
a[k] = a[i];
a[i] = t;
}
}
for (i = 1; i < 21; i++)
printf("%-2d ", a[i]);
printf("\n");
for (i = 1; i < 21; i++)
{
for (j = 1; j < 21; j++)
{
if (a[i] == b[j] && !c[j])
{
printf("%-2d ", j);
c[j] = 1;
}
}
}
printf("\n");
return 0;
}