資料結構學習筆記(六)鍊錶演算法題

2021-09-20 06:41:32 字數 2079 閱讀 4755

假期結束,看點題目。

設順序錶用陣列a表示,表中元素儲存在陣列下標1~m+n的範圍內,前m個元素遞增有序,後n個元素遞增有序,設計乙個演算法,使得整個順序表有序。

(1)給出演算法的基本設計思想。

(2)根據設計思想,採用c或c++語言描述演算法,關鍵之處給出注釋。

(3)說明你所設計演算法的時間複雜度和空間複雜度。

(1)演算法基本設計思想:

將陣列a中的m+n個元素(假設元素為int型)看成兩個順序表,表l和表r。將陣列當前狀態看做起始狀態,即此時表l由a中前m個元素構成,表r由a中後n個元素構成。要使a中m+n個元素整體有序只需將表r中的元素逐個插入表l中的合適位置即可。插入過程:取表

r中的第乙個元素a[m+1]存入輔助變數temp中,讓temp逐個與a[m],a[m-1],…,a[1]進行比較,當temp(2)演算法描述

void insert(int a,int m,int n)

else if (p->data > q->data)

q = q->next;

else }}

(3)演算法時間複雜度分析:

由演算法描述可知,演算法規模由m和n共同確定。演算法中有乙個單層迴圈,迴圈內的所有操作都是常數級的,因此可以用迴圈執行的次數作為基本操作執行的次數。可見迴圈執行的次數即為p, q兩指標沿著各自鍊錶移動的次數,考慮最壞的情況,即p, q都走完了自己所在的鍊錶,迴圈執行m+n次。即時間複雜度為o(m+n)。

設計乙個演算法,將順序表中的所有元素逆置。

兩個變數i,j指示順序表的第乙個元素和最後乙個元素,交換i,j所指元素,然後i向後移動乙個位置,j向前移動乙個位置,如此迴圈,直到i與j相遇時結束,此時順序表l中的元素已經逆置。

void reverse(sqlist &l) 

l.length -= l; //表長改變。

}

有乙個順序表l,其元素為整型資料,設計乙個演算法,將l中所有小於表頭元素的整數放在前半部分,大於的整數放在後半部分,陣列從下表1開始儲存。

本題可以這樣解決,先將l的第乙個元素存於變數temp中,然後定義兩個整型變數i,j。i從左往右掃瞄,j從右往左掃瞄。邊掃瞄邊交換。具體執行過程如下:

各步的解釋如下:

①開始狀態,temp = 2,i = 1; j = l.length

②j先移動,從右往左,邊移動邊檢查j所指元素是否比2小,此時發現-1比2小,則執行l.data[i]=l.data[j];i++;(i中元素已經被存入temp所以可以直接覆蓋,並且i後移一位,準備開始i的掃瞄)

③i開始移動,從左往右,邊移動邊檢測,看是否i所指元素比2大,此時發現-7比2小,因此i在此位置是什麼都不做。

④i繼續往右移動,此時i所指元素為-3也比2小,此時什麼都不做。

⑤i繼續往右移動,此時i所指元素為5,比2大,因此執行l.data[j] = l.data[i]; j--(j中元素已被儲存,j前移一位,準備開始j的掃瞄)

⑥j往左運動,此時j所指元素為6,比2大,j在此位置時,什麼都不做。

⑦j繼續往左移動,此時j==i,說明掃瞄結束。

⑧執行l.data[i] = temp;此時整個過程結束,所有比2小的元素被移到了2前邊,所有比2大的元素被移到了2後邊。

以上過程要搞清楚兩點:

①i和j是輪流移動的,即當i找到比2大的元素時,將i所指元素放入j所指位置,i停在當前位置不,j開始移動。j找到比2小的元素,將j所指元素放在i所指位置,j停在當前位置不動,i開始移動如此交替直到i==j。

②每次元素覆蓋(比如執行l.data[i] = l.data[j];)不會造成元素丟失,因為在這之前被覆蓋位置的元素已經存入其他位置。由以上分析可寫出如下演算法:

void move(sqlist &l) 

while(i < j&&l.data[i] < temp) i++; //與上邊的處理類似。

if(i < j)

/*關鍵步驟結束*/

}l.data[i] = temp; //將表首元素放在最終位置。

}

資料結構學習筆記(六)鍊錶演算法題

設順序錶用陣列a表示,表中元素儲存在陣列下標1 m n的範圍內,前m個元素遞增有序,後n個元素遞增有序,設計乙個演算法,使得整個順序表有序。1 給出演算法的基本設計思想。2 根據設計思想,採用c或c 語言描述演算法,關鍵之處給出注釋。3 說明你所設計演算法的時間複雜度和空間複雜度。1 演算法基本設計...

資料結構學習筆記(七)鍊錶演算法題 續

有乙個遞增非空單鏈表,設計乙個演算法刪除值域重複的結點。比如。解法一 定義指標p指向起始結點。將p所指當前結點值域和其直接後繼結點值域比較。如果當前結點值域等於後繼結點值域,刪除後繼結點 否則p指向後繼結點,重複以上過程,直到p的後繼結點為空。本題 如下 void delsl1 lnode l el...

資料結構學習筆記 鍊錶

表示式的計算 表示式的計算涉及到棧的操作 對於表示式 a b c d e f 演算法 用到兩個棧,分別是符號棧和運算元棧。輸入表示式時,為了表示表示式輸入完畢,在表示式的最後加上 號,也就是說輸入的表示式為 a b c d e f 首先設定各個符號的優先順序,和 的優先順序為0,也就是最低的 和 的...