哔哩哔哩数据结构讲解地址: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; }