想想还是大一下学期热衷算法时写的(现是应届毕业生了)
快速排序:(核心值分大小法)
基本思想:
取一个核心值,如下的算法是以每次排序序列的最后一位作为核心值,以核心值分成比和核心值大的部分和比核心值小的部分
如:序列:1 0 44 2 3
第一次调用priority,核心值x为3,p初始为left即为0
- 1比3小,i=0,p=1
- 0比3小,i=1,p=2
- 44比3大,i=2,p=2
- 2比3小,i=3,此时A[i]=2<A[p]=44,将他们换位置,即变成 1 0 2 44 3 此时p=3
- 跳出循环,将A[p]和核心值换(也可以理解将核心值插进比他小和比他大的值中间)即序列变为1 0 2 3 44
- 后面将核心值3的左边和右边同上边进行排序
其实快速排序就是将下标当为标志进行排序,可见上面p为多少即有多少个值小于核心值,将他们放在左边,如果从大排到小也就是将大于核心值的放左边,小于核心值的放右边,可自己尝试
int priority(int *A,int left,int right)
{
int x,t;
x=A[right];//x表示核心比较值,以最右的数据作为核心比较值
int p,i;
p=left;
for(i=left;i<right;i++)
{
if(A[i]<x)//如果小于核心比较值x,即将p位置加一
{
if(A[i]<A[p])//如果过程中有小于p位置的就进行调换,说明此时的p位置的是大于x的
{
t=A[i];
A[i]=A[p];
A[p]=t;
}
p++;
}
}
//将核心值和对应的p所在位置的值交换
t=A[p];A[p]=A[right];A[right]=t;
return p;
}
void qsort(int *A,int left,int right)
{
if(left>right)return ;
int p;
p=priority(A,left,right);
qsort(A,left,p-1);
qsort(A,p+1,right);
}
插入排序:(插入值法)
效率比较慢
- 如序列1 0 44 2 3
- 将数组遍历一遍
- 先从1开始,由于前面都没值,往下走
- i=1,即为0,此时的j=0时对应1,没有值比0小,即j为0,跳出第一个循环,1比0大,将数值0插入j的位置(代码把数值0的位置腾空,把j=0开始的数往后移动)此时序列变为0 1 44 2 3
- i=2,即数值44,不需要往前插
- 2比44小,0 1 比2小,即j=2,把从j=2开始到j=i-1=2的数值:即44往后移动,即序列变为:0 1 2 44 3
- 最后把3往前插即为0 1 2 3 44
//插入排序
void insertsort(int*A,int n)
{
int i,j,x,k;
for(i=0;i<n;i++)
{
j=0;
while(j<i&&A[j]<A[i])//比i位置小的数据不管
{
j++;
}
if(i!=j)//发现比i大的数据,前面都是有序的了
{
x=A[i];
k=i;
while(k>j)//将i位置腾空,将j后面的数字全部往后移,j腾空给i放
{
A[k]=A[k-1];
k--;
}
A[j]=x;
}
}
}
归并排序
(分而治之)(再开一个数组进行存储)
void msort(int*A,int left,int m,int right,int *temp)
{
int i=left;
int j=m+1;
int t=0;
while(i<=m&&j<=right)
{
if(A[i]<=A[j])
{
temp[t++]=A[i++];
}else{
temp[t++]=A[j++];
}
}
while(i<=m)
{
temp[t++]=A[i++];
}
while(j<=right)
{
temp[t++]=A[j++];
}
for(i=left;i<=right;i++)
{
A[i]=temp[i];
}
}
void addsort(int *A,int left,int right,int *temp)
{
if(right>left)
{
int m=(left+right)/2;
addsort(A,left,m,temp);//左归并排序
addsort(A,m+1,right,temp);//有归并排序
msort(A,left,m,right,temp);//左右序列归并排序
}
}
希尔排序
void xiersort(int *A,int n)
{
int i,j,d,x,k;
for(d=n/2;d>0;d/=2)//增量每次变为一半
{
for(i=d;i<n;i++)//插入算法
{
x=A[i];
for(j=i;A[j-d]>x&&j>=d;j-=d)
A[j]=A[j-d];
A[j]=x;
}
}
}
在此插入二分查找
int binarysort(int *A,int left,int right,int k)
{
int m=(right+left)/2;
if(A[m]==k)return m;
if(A[m]>k){
return binarysort(A,left,m-1,k);
}
if(A[m]<k){
return binarysort(A,m+1,right,k);
}
}
完整代码:(可运行)
#include<iostream>
using namespace std;
const int maxn=1e5;
//快速排序
int priority(int *A,int left,int right)
{
int x,t;
x=A[right];//x表示核心比较值,以最右的数据作为核心比较值
int p,i;
p=left;
for(i=left;i<right;i++)
{
if(A[i]<x)//如果小于核心比较值x,即将p位置加一
{
if(A[i]<A[p])//如果过程中有小于p位置的就进行调换,说明此时的p位置的是大于x的
{
t=A[i];
A[i]=A[p];
A[p]=t;
}
p++;
}
}
//将核心值和对应的p所在位置的值交换
t=A[p];A[p]=A[right];A[right]=t;
return p;
}
void qsort(int *A,int left,int right)
{
if(left>right)return ;
int p;
p=priority(A,left,right);
qsort(A,left,p-1);
qsort(A,p+1,right);
}
//插入排序
void insertsort(int*A,int n)
{
int i,j,x,k;
for(i=0;i<n;i++)
{
j=0;
while(j<i&&A[j]<A[i])//比i位置小的数据不管
{
j++;
}
if(i!=j)//发现比i大的数据,前面都是有序的了
{
x=A[i];
k=i;
while(k>j)//将i位置腾空,将j后面的数字全部往后移,j腾空给i放
{
A[k]=A[k-1];
k--;
}
A[j]=x;
}
}
}
//归并排序(分而治之)(再开一个数组进行存储)
void msort(int*A,int left,int m,int right,int *temp)
{
int i=left;
int j=m+1;
int t=0;
while(i<=m&&j<=right)
{
if(A[i]<=A[j])
{
temp[t++]=A[i++];
}else{
temp[t++]=A[j++];
}
}
while(i<=m)
{
temp[t++]=A[i++];
}
while(j<=right)
{
temp[t++]=A[j++];
}
for(i=left;i<=right;i++)
{
A[i]=temp[i];
}
}
void addsort(int *A,int left,int right,int *temp)
{
if(right>left)
{
int m=(left+right)/2;
addsort(A,left,m,temp);//左归并排序
addsort(A,m+1,right,temp);//有归并排序
msort(A,left,m,right,temp);//左右序列归并排序
}
}
//希尔排序
void xiersort(int *A,int n)
{
int i,j,d,x,k;
for(d=n/2;d>0;d/=2)//增量每次变为一半
{
for(i=d;i<n;i++)//插入算法
{
x=A[i];
for(j=i;A[j-d]>x&&j>=d;j-=d)
A[j]=A[j-d];
A[j]=x;
}
}
}
//堆排序
//二分查找
int binarysort(int *A,int left,int right,int k)
{
int m=(right+left)/2;
if(A[m]==k)return m;
if(A[m]>k){
return binarysort(A,left,m-1,k);
}
if(A[m]<k){
return binarysort(A,m+1,right,k);
}
}
int main()
{
int A[maxn],n,i,x,y;
printf("请输入数组个数:");
scanf("%d",&n);
printf("请输入数组:\n");
for(i=0;i<n;i++)
scanf("%d",&A[i]);;
printf("请输入数字选择排序方式1.快速排序 2.插入排序 3.归并排序 4.希尔算法\n");
scanf("%d",&y);
if(y==1)qsort(A,0,n-1);
else if(y==2)insertsort(A,n);
else if(y==3){int temp[maxn];addsort(A,0,n-1,temp);}
else if(y==4)xiersort(A,n);
printf("排序后数组如下:\n");
for(i=0;i<n;i++)
printf("%d ",A[i]);
printf("\n");
printf("请输入查找的数:");
scanf("%d",&x);
printf("第%d位为%d\n",binarysort(A,0,n-1,x)+1,x);
return 0;
}