数据结构-与表头比较后放置
与表头比较后放置
- 有一个顺序表L,其元素为整型数据,设计一个算法,将L中所有小于表头元素的整数放在前半部分,大于表头元素的整数放在后半部分。
思路:
首先将表头元素存储起来,然后用两个整型变量 i,j 分别从两端扫向中间,i从左往右扫,j从右往左扫。
j 从右往左扫到第一个小于表头元素的话,就把此时 j 的值赋值给 i 所指的位置。(后半部分比表头元素大的话就留下依然放在后面,一开始 i 的值就是表头元素的值,它已经被存储起来了,所以覆盖它完全没有问题)
然后 i 从左往右扫到第一个大于表头元素的值,就把此时 i 的值赋值给 j 所指的位置。(同理前半部分比表头元素小的话就留下依然放在前面,由于此时 j 所指的元素的值已经在上一次赋值给了先前的 i 位置,所以此时用 i 元素覆盖 j 完全没有问题)
最后 i,j 相遇结束操作
代码:
void move(Sqlist &L){ //L要改变,所以用引用型
int temp; //创建临时变量
int i=0, j=L.length-1; //创建头尾两个扫把
temp = L.data[i]; //将表头元素赋值给temp
while (i<j){
while (i<j && L.data[j] > temp)
--j; //j从右往左扫描,当来到第一个比temp小的元素时停止。
if (i<j){ //并且每走一步都要判断i是否小于j,这个判断容易遗漏
L.data[i] = L.data[j]; //移动元素
++i; //i右移一位
}
while (i<j && L.data[i]<temp)
++i; //i从左往右扫描,当来到第一个比temp大的元素时停止。
if(i<j){
L.data[j] = L.data[i]; //移动元素
--j; //j左移一位j
}
}
}