**
常用排序算法
- 冒泡排序:
void bubble(int a[],int n)
{//冒泡排序:依次比较两个相邻元素,按照要求顺序交换
int temp=0;
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-1-i;j++)
{//每次找到最大的数放到最后一个
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
display(a,n);
}
2 选择排序
void select_sort(int a[],int n)
{//选择排序:每次选择一个最小的元素放在待排队列队头
int min;
int k=0;
for(int i=0;i<n;i++)
{
min=a[i];
for(int j=i;j<n;j++)
{
if(a[j]<min)
{
min=a[j];
k=j;
}
}
a[k]=a[i];
a[i]=min;
}
display(a,n);
}
- 插入排序
void insert_sort(int a[],int n)
{//插入排序:每次在无序区选出一个元素,插到有序区
for(int i=1;i<n;i++)//将a[i]插入到a[0]...a[i-1]
{
if(a[i]<a[i-1])
{
int temp=a[i];
int j;
for(j=i-1;j>=0&&a[j]>temp;j--)
a[j+1]=a[j];
a[j+1]=temp;
}
}
display(a,n);
}
4.希尔排序
void shell_sort(int a[],int n)
{//特殊的插入排序
int temp;
for(int k=n/2;k>0;k=k/2)
{
for(int i=k;i<n;i++)
if(a[i-k]>a[i])//将a[i]插入有序表
{
temp=a[i];
for(int j=i;j>=0;j-=k)
{
if(a[j-k]>temp)
a[j]=a[j-k];
else
{
a[j]=temp;
break;
}
}
}
}
display(a,n);
}
- 快速排序
void QS(int left,int right,int a[])
{//一次快速排序
int i=left;
int j=right;
int mid=a[left];
if(left>=right)
return;
while(i!=j)
{
while(a[j]>mid&&i<j)
j--;
if(i<j)
a[i]=a[j];
while(a[i]<=mid&&i<j)
i++;
if(i<j)
a[j]=a[i];
}
a[i]=mid;
QS(left,i-1,a);
QS(i+1,right,a);
}
void quick_sort(int a[],int n)
{//快算排序:每次取第一个元素x,比它小的放在左边,大的放在右边,递归地排序
int left=0;
int right=n-1;
QS(left,right,a);
display(a,n);
}
- 归并排序
void merge(int a[],int low,int high,int mid)
{//a[low..mid]和a[low+1..high]各自有序
int b[8];
int i,j,k;
for(i=low;i<=high;i++)
b[i]=a[i];//将a复制到b中
for(i=low,j=mid+1,k=low;i<=mid&&j<=high;k++)
{//排序后重新放到a数组
if(b[i]<b[j])
a[k]=b[i++];
else
a[k]=b[j++];
}
while(i<=mid)
a[k++]=b[i++];
while(j<=high)
a[k++]=b[j++];
}
void merge_sort(int a[],int low,int high)
{//把两个或两个以上的有序表组成一个新的有序表
if(low<high)
{
int mid=(low+high)/2;
merge_sort(a,low,mid);
merge_sort(a,mid+1,high);
merge(a,low,high,mid);
}
}
- 堆排序*
void adjustdown(int a[],int k,int n)
{//自上而下调整以a[k]为根的小根堆,初始堆存在a[1...n]
int temp=a[k];
for(int i=2*k;i<=n;i*=2)//沿节点值较大的子节点向下移
{
if(i<n&&a[i]>a[i+1])
i++;
if(a[i]<temp)
{
a[k]=a[i];
k=i;
}
else
break;
}
a[k]=temp;
}
void minheap(int a[],int n)
{//由下至上逐步调整为小根堆
for(int i=n/2;i>=0;i--)
adjustdown(a,i,n);
}
void heap_sort(int a[],int n)
{//堆排序:以完全二叉树为结构,以小根堆为例(父节点节点值都小于子节点)
int temp;
minheap(a,n);//建立初始小根堆
for(int i=n;i>1;i--)
{//输出堆顶元素,与堆底交换后重新调整
cout<<a[1]<<" ";
temp=a[i];
a[i]=a[1];
a[1]=temp;
adjustdown(a,1,i-1);
}
}