正常的选择排序(伪代码)
非递归选择排序
void selSort(node * head) {//传入的是地址
node* p, *q,*t=NULL;
int mmin = 1 << 30,temp;//位运算,使1左移三十位取一个较大的值(我之前因为这个踩过坑,所以即使有INT_MAX,在数据范围不大的时候,我有时候还是想用这个)
for (p = head; p; p = p->next) {
for (q = p; q; q = q->next) {
if (q->val < mmin) {
mmin = q->val;
t = q;//是节点的值对换,不是mmin的对换
}
}
temp = p->val;
p->val = t->val;
t->val = temp;
mmin = 1 << 30;//循环里别忘了初始化
}
}
递归选择排序
void selRecursionSort(node *j) {//从大到小的冒泡排序
static node* t=NULL,*i=j;
static int mmin=1<<30;
//if (!i)
// return;
//不可沿用冒泡递归排序,因为冒泡排序的p是从head开始的
if (!j) {
int temp;
temp = i->val;
i->val = t->val;
t->val = temp;
i = i->next; j = i;
mmin = 1 << 30;
//而选择排序的j是从i开始的,要确定i不为空
if (!i)//链表要注意是否为空
return;//确定外层结束为返回条件
}
if (j->val < mmin) {
t = j;
mmin = j->val;
}
selRecursionSort(j->next);
}