C语言,结构体排序!解决方案

C语言,结构体排序!
#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"

struct num
{
int id;
int math;
int eng;
int sum;
};

int main(void)
{
int i,j,temp;
struct num stu[5];
printf("请录入信息!\n");
printf("学号 数学 英语\n");
for (i = 0; i < 5; i++)
{
scanf("%d %d %d",&stu[i].id,&stu[i].math,&stu[i].eng);
stu[i].sum = stu[i].eng + stu[i].math;
}
printf("按总分降序排列!");
for (i = 0; i < 5; i++)
{
temp = stu[i].sum;
for (j = i+1; j < 5; j++)
{
if (temp < stu[i].sum)
{
stu[i].sum = stu[j].sum;
stu[j].sum = temp;
temp = stu[i].sum;
}
}
}
printf("总分\n");
for (i = 0; i < 5; i++)
{
printf("%d \n",stu[i].sum);
}
system("pause");
return 0;
}


怎么才能让结构体中的其他成员的顺序,跟着总分的顺序而变呢?
------解决思路----------------------
有很多种方法
1种是不改变原始数据,只是另建一个指针数组,或者索引数组
这种多余大的数据排序比较好,因为大的数据,交换量很大

另外一种是改变数据的顺序的,通常的排序算法
比较的时候,比较总分就可以了,
交换的时候,交换整个结构

C,C++现在可以结构整体赋值,所以结构赋值语法很简练的

例如 
struct num
{
    int id;
    int math;
    int eng;
    int sum;
};
C:
void swap_num(struct num * a,struct num * b){
 struct num n=*a;
              *a=*b;
              *b=n;
}

C++ 可以直接用标准库的swap 也可以自己定义一个;
void swap_num(num &a,num&b)
{
           num n=a;
           a=b;
           b=n;
}

你的交换算法有问题,所以不能进行真正的排序