📌有序顺序表的合并
# 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++ ; }
}