跳跃空间(链表)排序 选择排序(selection sort),插入排序(insertion sort)

时间:2023-03-09 02:11:37
跳跃空间(链表)排序 选择排序(selection sort),插入排序(insertion sort)

跳跃空间(链表)排序 选择排序(selection sort),插入排序(insertion sort)

选择排序(selection sort)

算法原理:有一筐苹果,先挑出最大的一个放在最后,然后再跳出一个筐里剩下的最大的一个,放在刚才跳出来的最大的前面,以此类推,最后就排好顺序了。

代码:

//从起始于位置p的n个元素中选出最大者,所以n>1
template<typename T>
ListNode<T>* List<T>::selectMax(ListNode<T>* p, int n){ ListNode<T>* max = p;
while(1 < n--){
if((p = p->succ)->data >= max->data) max = p;
} return max;
} //对从p开始的连续n个元素做选择排序,n > 1
template<typename T>
void List<T>::selectionSort(ListNode<T>* p, int n){ ListNode<T>* head = p->pred;
ListNode<T>* tail = p; for(int i = 0; i < n; ++i) tail = tail->succ; while(1 < n){
ListNode<T>* node = selectMax(head->succ, n--); //调整这个节点的前后节点
node->pred->succ = node->succ;
node->succ->pred = node->pred; //把卸下来的节点加到最后一个元素的前面
//前进线路
tail->pred->succ = node;
node->succ = tail;
//后退路线
node->pred = tail->pred;
tail->pred = node; tail = node;
}
}

插入排序(insertion sort)

算法原理:打扑克或者打麻将时,每抓一张牌后,会根据手里的牌,把抓来的这张牌,插入到适当的顺序,每抓一张牌,插入一次,全部抓完后,顺序也就排好了。

代码:

//在p的前n个前驱中,查找不大于e的最后者
template<typename T>
ListNode<T>* List<T>::search(const T& e, int n, ListNode<T>* p){ while(0 < n--){
if(p->pred->data <= e) return p->pred;
p = p->pred;
} return p;
} //对从p开始的连续n个元素做选择排序
template<typename T>
void List<T>::insertionSort(ListNode<T>* p, int n){ for(int r = 0; r < n; r++){
if(r == 0) {
p = p->succ;
continue;
}
ListNode<T>* node = search(p->data, r, p->pred);
auto tmp = p->succ; //删除p节点
p->pred->succ = p->succ;
p->succ->pred = p->pred; //在node节点后面插入p节点
p->succ = node->succ;//设定p的后驱
node->succ->pred = p;//设定p的后驱的前驱 node->succ = p;//设定p的前驱的后驱
p->pred = node;//设定p的前驱 p = tmp;
}
}

c/c++ 学习互助QQ群:877684253

跳跃空间(链表)排序 选择排序(selection sort),插入排序(insertion sort)

本人微信:xiaoshitou5854