设顺序表用数组A[]表示,表中元素存储在数组下标0~m+n-1的范围内,前m个元素递增有序,后n个元素也递增有序,设计一个算法,使得整个顺序表完整。
//将链表分为两个表,一个表为已经排序的,一个表为待插入的
void sortLink(int a[], int number1,int number2)
{
int length = number1 + number2;
int cur_insertData = number1;//指向待插入的第一个元素
int now = 0;//这个是算法的优化部分。指向链表A还未处理的部分。链表A处理过的部分,一定小于链表B未处理的部分,所以不用判断这些东西了。
while (cur_insertData < length&&now<cur_insertData)//排序未完成
{
//如果序列2小于序列1,则在序列1的该位置插入序列2的元素
//首先 序列1的元素集体向后移动1位 然后腾出的位置给序列2的该元素
//最后inserData移动一位,now也移动一位
if (a[cur_insertData] < a[now])
{
int backup = a[cur_insertData];
for (int i = cur_insertData - 1; i >= now; i--)
{
a[i + 1] = a[i];
}
a[now] = backup;
cur_insertData++;
}
now++;
}
}
天勤答案的思路:将表分为两个线性表,线性表A为已经排序的,线性表B中的元素将要插入顺序表A。每次都从表A的末端开始,如果待排序的元素小于A,A的那个位置及其以后就集体向后移。不过我还是感觉我的代码好。
void sortLink2(int a[], int number1, int number2)
{
for (int i = number1; i < number1 + number2; i++)
{
int temp = a[i];
int j = i - 1;
while( temp <= a[j] && j >= 0)
{
a[j + 1] = a[j];
j--;
}
a[j+1] = temp;
}
}