各种排序
来源:互联网 发布:那个软件可以制作菜单 编辑:程序博客网 时间:2024/05/16 05:46
#if 1
#include <malloc.h>
#include <stdio.h>
//直接插入
void InsertSort(int *a,int len)
{
int i,j,temp,k;
for(i=1;i<len;i++)
{
k = a[i];
for(j=i-1;j>=0;j--)
{
if(k<a[j])
{
//a[j]和a[j+1]交换
temp = a[j+1];
a[j+1] = a[j];
a[j] = temp;
}
else
break;
}
}
}
//折半插入
void BInsertSort(int *a,int len)
{
int i,k,j;
for(i=1;i<len;i++)
{
k = a[i];
int mid;
int low = 0;
int high = i-1;
while(low<=high)
{
mid = (low+high)/2;
if(k<a[mid])
high = mid-1;
else
low = mid+1;
}
for(j=i-1;j>=low;j--)
{
a[j+1] = a[j];
}
a[j+1] = k;
}
}
//希尔排序
void shellSort(int *a,int len,int d)
{
int i,j,k,temp;
while(d>0) //趟数
{
for(i=d;i<len;i++) //要插入的次数
{
k = a[i];
for(j=i-d;j>=0;j-=d)
{
if(k<a[j])
{
//a[j]和a[j+1]交换
temp = a[j+d];
a[j+d] = a[j];
a[j] = temp;
}
else
break;
}
}
d--;
}
}
//快排
void QSort(int *a,int low,int high)
{
int i,j,temp,k;
if(low<high)
{
i = low;
j = high;
k = a[i];
while(i<j)
{
//已i端为支点
if(a[i]<=a[j])
j--;
else
{
//交换
temp = a[i];
a[i]= a[j];
a[j] = temp;
}
//以j端为支点
if(a[i]<=a[j])
i++;
else
{
//交换
temp = a[i];
a[i]= a[j];
a[j] = temp;
}
}
QSort(a,low,i-1);
QSort(a,low+1,high);
}
}
//选择
void SelectSort(int *a,int len)
{
int i,j,min,temp;
for(i=0;i<len-1;i++) //控制趟数
{
min = i;
//找最小值
for(j=i;j<len;j++)
{
if(a[j]<a[min])
{
min = j;
}
}
if(min!=i)
{
//交换
temp = a[i];
a[i] = a[min];
a[min] = temp;
}
}
}
//调整堆
void HeapAdjust(int *a,int len)
{
int i ;
for(i=len/2-1;i>=0;i--)
{
int j = 2*i+1; //左孩子
int key = a[i];
if(j+1<=len) //有孩子
{
if(j+1<len) //有右孩子
{
if(a[j]<a[j+1])
{
j = j+1;
}
}
if(a[j]>key)
{
//交换
int temp= a[j];
a[j] = key;
a[i] = temp;
}
}
}
}
//堆排
void HeapSort(int *a,int len)
{
int i;
for(i=0;i<len-1;i++) //调整次数
{
HeapAdjust(a,len-i);
int b = a[0];
a[0] = a[len-i-1];
a[len-i-1] = b;
}
}
//合并
void Memge(int *a,int first,int mid,int last,int *temp)
{
int i = first;
int j = mid;
int m = mid+1;
int n = last;
int k = 0;
while(i<=j&&m<=n)
{
if(a[i]<a[m])
{
temp[k++] = a[i];
i++;
}
else
{
temp[k++] = a[m];
m++;
}
}
while(i<=j)
{
temp[k++] = a[i];
i++;
}
while(m<=n)
{
temp[k++] = a[m];
m++;
}
for(i=0;i<k;i++)
{
a[first+i] = temp[i];
}
}
//归并排序
void MSort(int *a,int first,int last,int *&temp)
{
int mid;
if(first<last)
{
mid = (first+last)/2;
MSort(a,first,mid,temp);
MSort(a,mid+1,last,temp);
Memge(a,first,mid,last,temp);
}
}
void main()
{
int i;
int a[] = {49,38,65,97,76,13,69,49};
int n = sizeof(a)/sizeof(a[0]);
//InsertSort(a,n);
// BInsertSort(a,n);
// shellSort(a,n,3);
// QSort(a,0,n-1);
// SelectSort(a,n);
// HeapSort(a,n);
int *temp = (int *)malloc(sizeof(int)*n);
MSort(a,0,n-1,temp);
for(i=0;i<n;i++)
{
printf("%d ",a[i]);
}
}
#endif