每日一題 92 快速排序

2021-06-18 07:27:23 字數 1905 閱讀 4739

題目來自網路

題目(1):基於陣列的快速排序

題目(2):基於鍊錶的快速排序

----

題目(1):基於陣列的快速排序

思路:使用分治的思想,先選擇樞軸,之後執行一次劃分,並把原序列劃分兩個子串行,之後遞迴處理。

**:

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)

題目(2)基於鍊錶的快速排序

思路(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...