交换位置
/* 交换顺序表L中子表的记录,使枢轴记录到位,并返回其所在位置 */ /* 此时在它之前(后)的记录均不大(小)于它。 */ int Partition(SqList *L,int low,int high) { int pivotkey; pivotkey=L->r[low]; /* 用子表的第一个记录作枢轴记录 */ while(low<high) /* 从表的两端交替地向中间扫描 */ { while(low<high&&L->r[high]>=pivotkey) high--; swap(L,low,high); /* 将比枢轴记录小的记录交换到低端 */ while(low<high&&L->r[low]<=pivotkey) low++; swap(L,low,high); /* 将比枢轴记录大的记录交换到高端 */ } return low; /* 返回枢轴所在位置 */ }
对顺序表L中的子序列L->r[low..high]作快速排序
void QSort(SqList *L,int low,int high) { int pivot; if(low<high) { pivot=Partition(L,low,high); /* 将L->r[low..high]一分为二,算出枢轴值pivot */ QSort(L,low,pivot-1); /* 对低子表递归排序 */ QSort(L,pivot+1,high); /* 对高子表递归排序 */ } }
对L作快速排序
void QuickSort(SqList *L) { QSort(L,1,L->length); }
C++版可执行代码,已通过调试
#include<iostream> using namespace std; void swap1(int &x,int &y) { int temp=x; x=y; y=temp; } int partition(int a[],int low,int high) { int p=a[low]; while(low<high) { while(low<high&&a[high]>=p)high--; swap1(a[low],a[high]); while(low<high&&a[low]<=p)low++; swap1(a[low],a[high]); } return low; } void quicksort(int a[],int low,int high) { if(low<high) { int m=partition(a,low,high); quicksort(a,0,m-1); quicksort(a,m+1,high); } } int main() { int a[20]; int n; while(cin>>n) { for(int i=0;i<n;i++) cin>>a[i]; quicksort(a,0,n-1); for(int i=0;i<n;i++) cout<<a[i]<<' '; cout<<endl; } return 0; }