关于列表的排序算法

2018-01-15  本文已影响0人  LOOOOD
void insertionsort(ListNode p,int n){
for (int r = 0; r < n; r++) {
 insertAfter(search(p->data, r, p), p->data); 
 p = p->succ;
 remove(p->pred);
}
}

复杂度是O(n^2),是稳定算法

void selectionSort(ListNode p,int n){
ListNode header=p.pred,ListNode trailer=p;
for(int r=0,r<n,r++){
trailer=trailer.succ;
}//待排序区间为(header,trailer)
while(1<n){
ListNode max=selectMax(header.succ,n);//找出最大者
insertBefore(trailer,remove(max));//作为有序区间的首元素
trailer=trailer.pred;
n--;
}
}
//从位置p起始的n个元素中查找最大的元素
ListNode selectMax(ListNode p,int n){
ListNode max=p;
for(ListNode curr=p;1<n;n--){
if((curr=curr.succ).data>=max){
max=curr;
}
return max;
}

该算法复杂度为O(n^2),从selectMax方法着手,可整体优化为O(nlogn)

void merge(ListNode p,int n,List T,ListNode q,int m){
ListNode pp=p.pred;
while(m>0){
if((n>0)&&(p.data<=q.data)){
  if(q==(p=(p.succ))){
break;
n--;
}
  }
else{
insertBefore(p,L.remove((q=q.succ).pred));
m--;
}
p = pp->succ;
}

2.分治策略

void mergeSort(ListNode p, int n) { 
if (n < 2)
 return; //若待排序范围已足够小,则直接返回;
int m = n >> 1; //以中点为界
ListNode q = p; 
for (int i = 0; i < m; i++) 
q = q->succ; //均分列表
 mergeSort(p, m);
 mergeSort(q, n - m); //对前、后子列表分删排序
 merge(p, m, *this, q, n - m); //归并
}

总体算法复杂度是O(nlogn)

上一篇 下一篇

猜你喜欢

热点阅读