链表快速排序
链表快速排序
大致思想是通过一个指针数组转化为常规数组快速排序,最后再重新梳理链表。
#include <iostream> #include <vector> using namespace std; typedef struct NODE{ int data; NODE* next; NODE(int _data) : data(_data), next(nullptr){} }NODE; NODE* createLinkTable() { const int tableLen = 10; const int testArray[tableLen] = { 12, 32, 0, 45, 2, 78, 34, 8, 365, 7 }; NODE* root = new NODE(testArray[0]); NODE* prev = root; for (int i = 1; i < tableLen; i++) { NODE* cur = new NODE(testArray[i]); prev->next = cur; prev = cur; } return root; } void destroyLinkTable(NODE* table) { NODE* iter = table; while (iter) { NODE* next = iter->next; delete iter; iter = next; } } void sortLinkTable(vector<NODE*>& linkVec,const int left,const int right) { if (left >= right) { return; } NODE* flag = linkVec[right]; int leftIter = left; int rightIter = left; for (int i = left; i < right-1; i++) { if (linkVec[i]->data < flag->data) { swap(linkVec[leftIter], linkVec[i]); leftIter++; } else{ rightIter++; } } if (linkVec[leftIter]->data > linkVec[right]->data) { swap(linkVec[leftIter], linkVec[right]); } sortLinkTable(linkVec, left, leftIter-1); sortLinkTable(linkVec, leftIter + 1, right); } NODE* rebuildLinkTable(vector<NODE*>& linkVec) { NODE* root = linkVec[0]; NODE* prev = root; for (size_t i = 1; i < linkVec.size(); i++) { prev->next = linkVec[i]; prev = linkVec[i]; } prev->next = nullptr; return root; } NODE* sortLinkTable(NODE* table) { vector<NODE*> linkVec; NODE* cur = table; while (cur) { linkVec.push_back(cur); cur = cur->next; } sortLinkTable(linkVec, 0, linkVec.size()-1); return rebuildLinkTable(linkVec); } void displayLinkTable(const NODE* const table) { const NODE* iter = table; while (iter) { cout << iter->data << " "; iter = iter->next; } cout << endl; } int main(int argc, char* argv[]) { NODE* table = createLinkTable(); if (!table) { return -1; } displayLinkTable(table); table = sortLinkTable(table); displayLinkTable(table); destroyLinkTable(table); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述