設順序表 Va 中的數據元素遞增有序。試寫一算法,將 x 插入到順序表的適當位置上,以保證該表的有序性

題目:設順序表 Va 中的數據元素遞增有序。試寫一算法,將 x 插入到順序表的適當位置上,以保證該表的有序性

分析:

因爲是順序表,所以插入的時候得將 x 插入的位置之後的元素全部後移一個位序,假設 x 插入到第 i 個位置上,那麼,從第 i+1 到 Va.length-1(表長與位序差一) 的元素都向後移。

C語言實現:

#include<time.h>
#include<stdio.h>
#include<stdlib.h>

int ListIn(int x)
{
int a[7] = {1, 2, 3, 5, 6, 7, 0};  // 定義遞增有序的順序表
int i = 0;
int j;
int cc = 0;
{ // 調試代碼區域
int aa = 0;
for( aa; aa<7; aa++) 
printf("%d ", a[aa]);
}
while( 1 )
{
	if( a[i] <= x && a[i+1] >= x ) break;  // 確定插入位置
	i ++;
}
	for( j = 6; j >= i+1; j-- )  //如果寫成 for(j=i+1;j<=6;j++)不行,爲什麼不行下邊會有解釋
	{
		a[j+1] = a[j];        // 元素後移
	}	

a[i+1] = x;                // 插入元素 x
printf("\n");
printf("插入後的數組爲:\n");

for(cc; cc <=7; cc++) printf("%d ", a[cc]);    // 查看是否插入成功
	return 0;
}

int main(void)
{
	ListIn(4);
}

分析爲什麼 for 循環條件不能從小到大遍歷:

圖解:

初始時的順序表爲:

當判斷出待插入位置爲 3 時,會跳出 while 循環進入 for 循環,此時如果是 for(j=i+1;j<=6;j++) 則 i = 4,a[5] = a[4],即:

接下來 i = 5, a[6] = a[5] 而 a[5] = 5,所以:

最後 i = 6, a[7] = a[6]:

可以看出:從小到大移動的話相當於覆蓋:用第 i 個元素一直向後覆蓋。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章