📌有序順序表的合并
# define MAX_SIZE 20
struct SeqList
{ int data[ MAX_SIZE] ; int length;
} ;
void mergeArray ( SeqList & L1, SeqList & L2, SeqList & L)
{ int i= 0 , j = 0 ; while ( i< L1. length && j< L2. length) { if ( L1. data[ i] < L2. data[ j] ) L. data[ length++ ] = L1. length[ i++ ] ; else L. data[ length++ ] = L2. length[ j++ ] ; } while ( i< L1. length) { L. data[ length++ ] = L1. length[ i++ ] ; } while ( i< L2. length) { L. data[ length++ ] = L2. length[ j++ ] ; }
}
📌刪除有序順序表重復元素
void deleteRepeatELement ( SeqList & L)
{ int slow = 0 , fast= 1 ; while ( fast< L. length) { if ( L. data[ slow] == L. data[ fast] ) { fast++ ; } else if ( L. data[ slow] != L. data[ fast] ) { L. data[ ++ slow] = L. data[ fast++ ] ; } } L. length = slow+ 1 ;
}
通過快慢指針的追趕,將不重復的元素 "前移",覆蓋掉重復元素,最終實現原地去重,時間復雜度為 O (n),空間復雜度為 O (1)。
📌編寫算法,對n個關鍵字取整數值的記錄序列進?整理,以使得所有關鍵字為負數的記錄排在關鍵字為?負數的記錄之前。
void reOrderArray ( SeqList & L)
{ int i= 0 , j= 0 ; while ( j< L. length) { if ( L. data[ j] < 0 ) { if ( i!= j) { int tmp = L. data[ i] ; L. data[ i] = L. data[ j] ; L. data[ j] = tmp; } i++ ; j++ ; } else j++ ; }
}
📌設有?組初始記錄關鍵字序列(K1,K2,…,Kn),要求設計?個算法能夠在O(n)的時間復雜度內將線性表劃分成兩部分,其中左半部分的每個關鍵字均?于Ki,右半部分的每個關鍵字均?于Ki。
void spliceArrayother ( SeqList & L)
{ int left = 0 ; int right = L. length - 1 ; while ( left <= right ) { while ( L. data[ left] < key) left ++ ; while ( L. data[ right] > key) right -- ; if ( left <= right) { int tmp = L. data[ left] ; L. data[ left] = L. data[ right] ; L. data[ right] = tmp; left ++ ; right-- ; } }
}
void spliceArray ( SeqList & L)
{ int key; int i = 0 , j= 0 ; while ( j < L. length) { if ( L. data[ j] > key) { if ( i != j) { int tmp = L. data[ i] ; L. data[ i] = L. data[ j] ; L. data[ j] = tmp; } i++ ; j++ ; } j++ ; }
}