題目描述:順序表L的元素遞增有序排列,設計一個算法在插入元素x后保持該順序表仍然遞增有序排列,插入成功后返回插入元素所在位置,不成功返回-1
算法思想:在遞增有序的順序表中插入元素?x?并保持有序性,步驟如下:
合法性檢查:若順序表已滿(length == MAXSIZE)或指針為空,插入失敗,返回?-1。
查找插入位置:遍歷順序表,找到第一個大于等于?x?的元素的位置?i;若所有元素均小于?x,則插入到表尾(i = length)。
元素后移:從表尾開始,將位置?i?及之后的元素全部后移一位,騰出插入位置。
插入元素:將?x?存入位置?i,表長加 1,返回插入位置?i。
復雜度分析:時間復雜度O(n)空間復雜度O(1)
代碼實現:
#include <stdbool.h>
#define MAXSIZE 100 // 假設順序表最大容量typedef struct {int data[MAXSIZE];int length;
} SeqList;int InsertOrder(SeqList *L, int x) {// 檢查表是否已滿或指針為空if (L == NULL || L->length >= MAXSIZE) {return -1;}int i;// 找到第一個大于等于x的元素的位置for (i = 0; i < L->length; i++) {if (L->data[i] >= x) {break;}}// 若所有元素均小于x,i此時等于length// 從后向前移動元素,騰出插入位置for (int j = L->length; j > i; j--) {L->data[j] = L->data[j - 1];}L->data[i] = x; // 插入xL->length++; // 表長增加return i; // 返回插入位置
}