第六章-快速排序、合并排序
哔哩哔哩数据结构讲解地址:https://space.bilibili.com/356198029
视频讲解过程地址:https://www.bilibili.com/video/av75201323
快速排序
#include<iostream> using namespace std; void quicksort(int[], int, int); int partition(int[], int, int); int main() { int array [] = {55,2,6,4,32,12,9,73,26,37}; int len = sizeof(array) / sizeof(int); cout<<"输入的原始序列: "; for(int i=0; i<len; i++) // 输出原序列 cout<<array[i]<<","; cout<<endl<<endl; quicksort(array,0, len-1); // 调用排序函数 cout<<" ----快速排序结果---- " << endl; for(int i=0; i<len; i++) cout<<array[i]<<","; cout<<endl; return 0; } void quicksort(int a[], int left, int right) // 快排算法 { if(left<right) { int pivotpos = partition(a,left,right); // 排好序的基准元素 quicksort(a,left, pivotpos-1); // 根据基准元素划分的块,递归 quicksort(a,pivotpos+1,right); // 根据基准元素划分的块,递归 } } int partition(int a[], int left, int right) // 划分算法,核心 { int pivot = a[left]; while(left<right) // 两个相遇结束 { while(left<right && a[right] >= pivot) --right; //从每一部分的最后一位开始检查 if(left<right) a[left++] = a[right]; // 将比基准小的放在基准左侧 结合while说明 right小于pivot while(left<right && a[left] <= pivot) ++left; // 从每一部分的最初一位开始检查 if(left<right) a[right--] = a[left];// 将比基准大的放在基准右侧结合while说明 left大于pivot } a[left] = pivot; // 将基准元素放在最终的位置上,使得左边都是比他小的,右边都是比他大的 return left; }
合并排序
#include<iostream> using namespace std; void Merge(int [], int, int, int, int []); // 归并排序划分过程 void MergeSort(int a[], int left, int right, int temp[]) { if(left < right) { int mid = (left + right) >> 1; MergeSort(a,left,mid,temp); MergeSort(a,mid+1,right,temp); Merge(a,left,mid,right,temp); } } // 归并排序合并过程 // 将数组下标范围[left,mid]和[mid+1,right]的有序序列合并成一个有序序列 void Merge(int a[], int left, int mid, int right, int temp[]) { int p0 = 0; int p1 = left, p2 = mid + 1; // p0指向辅助数组的首位 // p1指向数组[left,mid]的首位,p2指向数组[mid+1,right]的首位 // 开始排序,< 先放小元素升序,>降序 while(p1<=mid && p2<=right) { if(a[p1] < a[p2]) temp[p0++] = a[p1++]; else temp[p0++] = a[p2++]; } ////如果还有剩余元素,直接放入到辅助数组中 while(p1<=mid) temp[p0++] = a[p1++]; while(p2<=right) temp[p0++] = a[p2++]; // 拷贝temp排好顺序的元素到数组a中, // 注意数组a是从left开始的,不能默认为0,并且一共有元素right-left+1个元素。 for(int i=0; i<right-left+1;++i) a[left+i] = temp[i]; } int main() { int array [] = {55,2,6,4,32,12,9,73,26,37}; int len = sizeof(array) / sizeof(int); cout<<"输入的原始序列: "; for(int i=0; i<len; i++) // 输出原序列 cout<<array[i]<<","; cout<<endl<<endl; cout<<" ----归并排序结果---- " << endl; int *temp = new int [len]; MergeSort(array,0,len-1,temp); // 调用排序函数 for(int j=0; j<len; j++) cout<<array[j]<<","; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!