題目來自網路
題目(1):基於陣列的快速排序
題目(2):基於鍊錶的快速排序
----
題目(1):基於陣列的快速排序
思路:使用分治的思想,先選擇樞軸,之後執行一次劃分,並把原序列劃分兩個子串行,之後遞迴處理。
**:
題目(2)基於鍊錶的快速排序int partition(int narr,int nstart,int nend)
narr[nstart] = narr[nend];
while(nstart < nend && narr[nstart] <= nkey)
narr[nend] = narr[nstart];
} narr[nstart] = nkey;
return nstart;
}void qsort(int narr,int nstart,int nend)
int nloc = partition(narr,nstart,nend);
qsort(narr,nstart,nloc - 1);
qsort(narr,nloc + 1,nend);
}void qsort(int narr,int nlen)
思路(1)改變結點的值,不破壞鍊錶指向。
**:
struct listnode
;/*對區間[pstartnode,pendnode - 1]之間的結點進行排序*/
listnode* partition(listnode* pstartnode,listnode* pendnode)
else
}pfast = pfast->m_pnext;
} //返回分割點位置
pslow->m_ndata = nkey;
return pslow;
}void qsort(listnode* pstartnode,listnode* pendnode)
listnode* pkeypos = partition(pstartnode,pendnode);
qsort(pstartnode,pkeypos);
qsort(pkeypos->m_pnext,pendnode);
}
思路(2)不改變結點的值,但改變鍊錶指向。
**:
struct listnode
;//*對區間[pstartnode,pendnode - 1]之間的結點進行排序*/
listnode* partition(listnode* pstartnode,listnode* pendnode)
else
else
}pcur = pcur->m_pnext;
} //兩個鍊錶拼接在一起
if (plesshead != null)
else
plastgreatlist->m_pnext = pendnode;
//返回第乙個結點的位址
return plesshead;
}listnode* qsort(listnode* pstartnode,listnode* pendnode)
listnode* pnewhead = partition(pstartnode,pendnode);
phead = qsort(pnewhead,pstartnode); //此鍊錶第乙個結點的位址是鍊錶的首位址,需要返回
pstartnode->m_pnext = qsort(pstartnode->m_pnext,pendnode);//此鍊錶第乙個結點的位址應該放入樞軸的next中
return phead;
}
每日一題 92 歸併排序
題目來自網路 題目 1 基於陣列的歸併排序 題目 2 基於鍊錶的歸併排序 題目 1 基於陣列的歸併排序 思路 借助分治的思想,總是先對待排序進行分割,之後再對兩個子串行進行合併,生成乙個有序序列。時間複雜度為o nlogn 空間複雜度為o n void merge int narr,int nsta...
每日一題 快速排序 20091016
b 問題描述 b 請實現快速排序,並討論pivot對複雜度的影響。b 問題分析 b 快速排序是目前使用頻率較高的排序 當然,有時候為了偷懶就可以冒泡一下 很多參考書上對pivot的選擇就是選擇第乙個元素,但如果是乙個高度排序的序列的話,時間複雜度就會接近o n2 還不如直接用冒泡完成。所以選擇乙個合...
每日一題力扣92
反轉從位置 m 到 n 的鍊錶。請使用一趟掃瞄完成反轉。class solution def reversebetween self,head listnode,m int,n int listnode if m n return head dummy listnode 1 dummy.next h...