首页 > 代码库 > [7] 算法之路 - 快速排序之3轴演算
[7] 算法之路 - 快速排序之3轴演算
左轴演算、中轴演算、右轴演算
题目:
快速排序法(quick sort)是目前所公认最快的排序方法之一(视解题的对象而定),虽然快速排序法在最差状况下可以达O(n2),但是在多数的情况下,快速排序法的效率表现是相当不错的。
快速排序 - 算法
1、快速排序法的基本精神是在数列中找出适当的轴心,然后将数列一分为二
2、分别对左边与右边数列进行排序
左轴演算:
// 快速排序 - 左轴演算 // 1. 附设两个指针left/right,并设最左端的数为最初枢轴pivot // 2. 从右向左搜索,找到第一个比pivot小的数,将其缓存进枢轴位置 // 3. 从左向右搜索,找到第一个比pivot大的数,缓存进上一个比pivot小的数的位置程式进入2.循环 // 4. 最后一次交换后获得的有效空位置为a[i] ,此时再将pivot赋值给a[i] 此时a[i]左边的数比a[i]小,右边的数比a[i]大 // 再分别对其左边与左边进行快速排序 int QuickSort2(int a[],int left,int right) { if(left<right) { int i = left,j=right,pivotloc=a[left]; while(i < j) { while(i<j && a[j]>=pivotloc) j--; if(i<j) a[i++]=a[j]; while(i<j && a[i]<pivotloc)i++; if(i<j) a[j--]=a[i]; } a[i]=pivotloc; QuickSort2(a,left,i-1); QuickSort2(a,i+1,right); } return 0; }
int QuickSort5(int a[],int left,int right) { if(left<right) { int i = left,j=right,pivotloc=a[left]; while(i < j) { while(i<j && a[i]<=pivotloc) i++; while(i<j && a[j]>pivotloc) j--; if(i<j) { SWAPER(a[i],a[j]); i++;j--; } } if(a[j]<a[left]) { SWAPER(a[left],a[j]); } QuickSort5(a,left,j-1); QuickSort5(a,j,right); } return 0; }
中轴演算
// 快速排序 int QuickSort3(int a[],int left,int right) { int i,j,pivot; if(left<right) { pivot=a[(left+right)/2]; i=left-1; j=right+1; while(i<j) { while(a[++i]<pivot) ; while(a[--j]>pivot) ; if(i<j) SWAPER(a[i],a[j]); } QuickSort3(a,left,i-1); QuickSort3(a,j+1,right); } return 0; }
右轴演算
// 快速排序演算 // 1. 首先选择最右边的元素作为枢轴pivot // 2. 从左向右搜索,寻找小于pivot的数,将其与左边第一个未交换的元素交换 // 3. 当搜索到最右边时,左边已交换的数都比pivot小,而未交换的都比pivot大 // 4. 将左边的第一个未交换的元素与最右边的pivot元素交换,并返回该未交换元素的索引 // 此时i左边的元素比i小,右边的比i大 // 程式进入.循环分别对0 →i -1 及最右边的i+1→right进行递归(快速排序) 最终该序列会变为有序 int Partition2(int a[],int left,int right) { int i = left,j; int pivot=a[right]; for(j=left;j<right;j++) { if(a[j]<pivot) { if(i!=j)SWAPER(a[i],a[j]); i++; } } if(i!=right)SWAPER(a[i],a[right]); return i; } int QuickSort4(int a[],int left,int right) { int pivot; if(left<right) { pivot=Partition2(a,left,right); QuickSort4(a,left,pivot-1); QuickSort4(a,pivot+1,right); } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。