//shell排序
/*先写一个插入排序*/
void inssort2(int a[],int n,int incr) {
for(int i=incr-1;i<n;i+=incr) {
for(int j=i;(j>=incr)&&(a[j]<a[j+1]);j-=incr)
swap(a[j],a[j-incr]);
}
}
void shellsort(int a[],int n) {
for(int i=n/2;i>2;i/=2) //each incr
for(int j=0;j<i;j++) //sort sublist
inssort2(a,n-j,i);
inssort(a,n,1);
}
/* 插入排序
实现的思路为
将无序序列首字符在有序序列中一路向上换
停止即插入
*/
void inssort(int a[],int n) {
for(int i=1;i<n;i++) {
for(int j=i;(j>0)&&(a[j]<a[j-1]);j--)
swap(a[j],a[j-1]);
}
}
/* 冒泡排序
bubble算法思想一样
如果后者更小就向前交换
与插入排序不同的是
bubble从后向前,可以改变总末端到有序末端之间的所有元素位置
*/
void bubsort(int a[],int n) {
for(int i=0;i<n-1;i++)
for(int j=n-1;j>i;j--)
if(a[j]<a[j-1])
swap(a[j],a[j-1]);
}
/* 改进的冒泡排序算法
*/
void r_bubsort(int a[],int n) {
int flag; //标记是否进行过交换
for(int i=0;i<n-1;i++) {
flag=0;
for(int j=n-1;j>i;j--)
{
swap(a[j],a[j-1]);
flag=1;
}
if(flag==0) return;
}
}
/*
选择排序
找最小值并记录下标
*/
void selsort(int a[],int n) {
for(int i=0;i<n-1;i++) {
int lowindex=i; //remember its index
for(int j=n-1;j>i;j--) //find least
if(a[j]<a[lowindex])
lowindex=j; //put it in place
swap(a[i],a[lowindex]);
}
}
/*希尔排序
*/
void inssort2(int a[],int n,int incr) {
for(int i=incr;i<n;i+=incr)
for(int j=i;(j>=incr)&&(a[j]<a[j-incr]);j-=incr)
swap(a[j],a[j-incr]);
}
void shellsort(int a[],int n) {
for(int i=n/2;i>2;i/=2) //for each incr
for(int j=0;j<i;j++) //sort sublists
inssort2(a,n-j,i);
inssort2(a,n,1);
}
/*
快速排序
*/
//递归版
void qsort(int a[],int i,int j) {
if(j<=i) return; //List too small
int pivotindex=findpivot(a,i,j); //找“界碑”
swap(a[pivotindex],a[j]); //put pivot at end
int k=partintion(a,i-1,j,a[j]);
swap(a[j],a[k]); //put pivot inplace
qsort(a,i,k-1);
qsort(a,k+1,j);
}
int findpivot(int a,int i,int j) {return (i+j)/2;}
int partition(int a[],int l,int r,int &pivot) {
do{
while(a[++l]<pivot);
while((l<r)&&pivot<a[--r]);
swap(a[l],a[r]);
}while(l<r);
return l;
}
/*快速排序的非递归实现
没有任何神奇的地方,单纯用占存储了左右界标而已
*/
int partation(int a[],int left,int right) {
int pivot=left; //选取左边第一个作为界标
int i=left,j=right; //左右指针
while(i<j) {
while(i<j&&a[j]>a[pivot]) --j;
while(i<j&&a[i]<a[pivot]) ++i;
swap(a[i],a[j]);
}
swap(a[pivot],a[i]);
return i;
}
void qsort(int a[],int n) {
stack<int> s;
s.push(n-1);
s.push(0);
while(!s.empty()) {
int left=s.top();s.pop();
int right=s.top();s.pop();
int mid=partation(a,left,right);
if(right>mid+1) {
s.push(right);
s.push(mid+1);
}
if(left<mid-1) {
s.push(mid-1);
s.push(left);
}
}
}
八大排序实现
于 2022-10-20 20:41:30 首次发布