快速排序+归并排序
int mid(int a,int b,int c)
{
if(a > b) swap(a,b);
if(a > c) swap(a,c);
if(b > c) swap(b,c);
return b;
}
void QuickSort(int a[],int L,int R)
{
if(L >= R) return;
int m = (R+L)/2;
int v = mid(a[L],a[m],a[R]); //优化选择中间位置
int i = L,j = R;
while(i<j)
{
while(a[i] < v) i++;
while(a[j] > v) j--;
if(i <= j)
{
swap(a[i],a[j]);
i++;
j--;
}
}
QuickSort(a,L,i-1);
QuickSort(a,i,R);
}
一种划分方法,划分后 所选因子 在中间
int Partition(int * R,int i,int j) {//调用Partition(R,low,high)时,对R[low..high]做划分, //并返回基准记录的位置 int pivot=R[i]; //用区间的第1个记录作为基准 ' while(i<j){ //从区间两端交替向中间扫描,直至i=j为止 while(i<j&&R[j]>=pivot) //pivot相当于在位置i上 j--; //从右向左扫描,查找第1个关键字小于pivot.key的记录R[j] if(i<j) //表示找到的R[j]的关键字<pivot.key R[i++]=R[j]; //相当于交换R[i]和R[j],交换后i指针加1 while(i<j&&R[i]<=pivot) //pivot相当于在位置j上 i++;//从左向右扫描,查找第1个关键字大于pivot.key的记录R[i] if(i<j) //表示找到了R[i],使R[i].key>pivot.key R[j--]=R[i]; //相当于交换R[i]和R[j],交换后j指针减1 } //endwhile R[i]=pivot; //基准记录已被最后定位 return i; } //partition
#include <iostream>
#include <cstdio>
using namespace std;
int Partition(int *L,int low,int high){
int pivotkey=L[low];
int i = low, j = high+1;
while(i<j){
while (L[++i]<pivotkey && i<=high);
while (L[--j]>pivotkey);
if (i<j) {swap(L[i],L[j]);}
}
swap(L[low],L[j]);
return j;
}
int NSort(int *L,int low,int high,int k){
int mid;
if(low<=high){
mid=Partition(L,low,high);
printf("l=%d r=%d m=%d k=%d\n",low,high,mid,k);
if(high-mid+1==k) return L[mid];
else if(high-mid+1<k) return NSort(L,low, mid-1, k-(high-mid+1));
else return NSort(L,mid+1, high,k);
}
return 0;
}
归并排序
void MergeSort(int *A,int L,int R,int *B) { if(R<=L) return; int m = (L+R)/2; MergeSort(A,L,m,B); MergeSort(A,m+1,R,B); int p = m+1,q=L,k=L; while(p <= R || q<=m) { if((q<=m && A[q]<=A[p])|| p > R) { B[k++]=A[q++]; } else B[k++]=A[p++]; } for(int i = L; i <=R; i++) A[i]=B[i]; }
posted on 2016-12-06 13:55 zyz913614263 阅读(110) 评论(0) 收藏 举报
浙公网安备 33010602011771号