一:插入排序
二:交换排序
2.快排:
三:选择排序
2.堆排序:
四:归并排序
1.直接插入排序:首先默认前面1,2……N个元素师排好序的。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef int ElemType;
void InsertSort(ElemType a[],int n)
{
ElemType x;
int i,j;
for(i=1;i<n;i++)
{
x=a[i];
for(j=i-1;j>=0;j--)
{
if(x<a[j])
a[j+1]=a[j];
else
break;
}
a[j+1]=x;
}
}
int main()
{
int n,i;
ElemType a[100000]={0};
printf("请输入要测试的数据的个数:");
while(1)
{
scanf("%d",&n);
if(n==0)
break;
srand(time(NULL));
for(i=0;i<n;i++)
a[i]=rand()%100000;
printf("原序:");
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n排序后:");
InsertSort(a,n);
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n***************************************\n");
}
return 0;
}
2.折半插入排序:若要插入一个记录,可先对有序的记录序列折半,确定要插入记录的位置在前一半序列,还是在后一半序列中,不断地对有序的记录序列折半,最后找到合适的插入位置。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef int ElemType;
void Binsort(ElemType a[],int n)
{
ElemType x;
int i,j,low,high,mid;
for(i=1;i<n;i++)
{
x=a[i];
low=0;
high=i-1;
while(low<=high)
{
mid=(low+high)/2;
if(x<a[mid])
high=mid-1;
else
low=mid+1;
}
for(j=i-1;j>=low;j--)
a[j+1]=a[j];
a[low]=x;
}
}
int main()
{
int n,i;
ElemType a[100000]={0};
printf("请输入要测试的数据的个数:");
while(1)
{
scanf("%d",&n);
if(n==0)
break;
srand(time(NULL));
for(i=0;i<n;i++)
a[i]=rand()%100000;
printf("原序:");
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n排序后:");
Binsort(a,n);
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n***************************************\n");
}
return 0;
}
3.希尔排序:
不断地把待排序的一组记录按间隔值分成若干小组,分别进行组内直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。对间隔值(用d 表示)的取法有多种,希尔提出的方法是:d1=[n/2],di+1=[di/2],最后一次排序时间的间隔值必须为1,其中n 为记录数。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef int ElemType;
void Shellsort(ElemType a[],int n)
{
ElemType x;
int i,j,d;
d=n/2;
while(d>=1)
{
for(i=d;i<n;i++)
{
j=i-d;
while(j>=0)
{
if(a[j]>a[j+d])
{
x=a[j];
a[j]=a[j+d];
a[j+d]=x;
j=j-d;
}
else
j=-1;
}
}
d=d/2;
}
}
int main()
{
int n,i;
ElemType a[100000]={0};
printf("请输入要测试的数据的个数:");
while(1)
{
scanf("%d",&n);
if(n==0)
break;
srand(time(NULL));
for(i=0;i<n;i++)
a[i]=rand()%100000;
printf("原序:");
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n排序后:");
Shellsort(a,n);
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n***************************************\n");
}
return 0;
}
二:交换排序
1.冒泡排序:
依次比较相邻的两个数,将小数放在前面,大数放在后面。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef int ElemType;
void BubbleSort(ElemType a[],int n)
{
ElemType x;
int i,j,flag;
for(i=0;i<n;i++)
{
flag=0;
for(j=n-1;j>i;j--)
if(a[j]<a[j-1])
{
flag=1;
x=a[j];
a[j]=a[j-1];
a[j-1]=x;
}
if(flag==0)
break;
}
}
int main()
{
int n,i;
ElemType a[100000]={0};
printf("请输入要测试的数据的个数:");
while(1)
{
scanf("%d",&n);
if(n==0)
break;
srand(time(NULL));
for(i=0;i<n;i++)
a[i]=rand()%100000;
printf("原序:");
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n排序后:");
BubbleSort(a,n);
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n***************************************\n");
}
return 0;
}
2.快排:
(1).先从数列中取出一个数作为基准数。
(2).分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
(3).再对左右区间重复第二步,直到各区间只有一个数。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef int ElemType;
void QuickSort(ElemType a[],int l,int r)
{
ElemType x;
int i,j;
if(l<r)
{
i=l,j=r,x=a[l];
while(i<j)
{
while(i<j&&a[j]>=x)
j--;
if(i<j)
a[i++]=a[j];
while(i<j&&a[i]<x)
i++;
if(i<j)
a[j--]=a[i];
}
a[i]=x;
QuickSort(a,l,i-1);
QuickSort(a,i+1,r);
}
}
int main()
{
int n,i;
ElemType a[100000]={0};
printf("请输入要测试的数据的个数:");
while(1)
{
scanf("%d",&n);
if(n==0)
break;
srand(time(NULL));
for(i=0;i<n;i++)
a[i]=rand()%100000;
printf("原序:");
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n排序后:");
QuickSort(a,0,n-1);
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n***************************************\n");
}
return 0;
}
三:选择排序
1.直接选择:每次选择最小的放在前面。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef int ElemType;
void SelectSort(ElemType a[],int n)
{
int i,j,k;
ElemType x;
for(i=0;i<n;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(a[j]<a[k])
k=j;
if(k!=i)
{
x=a[i];
a[i]=a[k];
a[k]=x;
}
}
}
int main()
{
int n,i;
ElemType a[100000]={0};
printf("请输入要测试的数据的个数:");
while(1)
{
scanf("%d",&n);
if(n==0)
break;
srand(time(NULL));
for(i=0;i<n;i++)
a[i]=rand()%100000;
printf("原序:");
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n排序后:");
SelectSort(a,n);
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n***************************************\n");
}
return 0;
}
2.堆排序:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef int ElemType;
void sift(ElemType a[],int n,int i)
//假定a[i+1]~a[n-1]构成的堆是有序的,a[i]为待插入的根结点
{
ElemType x=a[i];
int j=2*i+1;
while(j<=n-1)
{
if(j<n-1 && a[j]<a[j+1])
j++;
if(a[j]>x)
{
a[i]=a[j];
i=j;
j=2*j+1;
}
else
break;
}
a[i]=x;
}
void HeapSort(ElemType a[],int n)
{
int i;
ElemType x;
for(i=n/2-1;i>=0;i--)
sift(a,n,i);
for(i=1;i<n;i++)
{
x=a[n-i];
a[n-i]=a[0];
a[0]=x;
sift(a,n-i,0);
}
}
int main()
{
int n,i;
ElemType a[100000]={0};
printf("请输入要测试的数据的个数:");
while(1)
{
scanf("%d",&n);
if(n==0)
break;
srand(time(NULL));
for(i=0;i<n;i++)
a[i]=rand()%100000;
printf("原序:");
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n排序后:");
HeapSort(a,n);
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n***************************************\n");
}
return 0;
}
#include <iostream>
#include<algorithm>
using namespace std;
void HeapAdjust(int *a,int i,int size) //调整堆
{
int lchild=2*i; //i的左孩子节点序号
int rchild=2*i+1; //i的右孩子节点序号
int max=i; //临时变量
if(i<=size/2) //如果i不是叶节点就不用进行调整
{
if(lchild<=size&&a[lchild]>a[max])
{
max=lchild;
}
if(rchild<=size&&a[rchild]>a[max])
{
max=rchild;
}
if(max!=i)
{
swap(a[i],a[max]);
HeapAdjust(a,max,size); //避免调整之后以max为父节点的子树不是堆
}
}
}
void BuildHeap(int *a,int size) //建立堆
{
int i;
for(i=size/2;i>=1;i--) //非叶节点最大序号值为size/2
{
HeapAdjust(a,i,size);
}
}
void HeapSort(int *a,int size) //堆排序
{
int i;
BuildHeap(a,size);
for(i=size;i>=1;i--)
{
//cout<<a[1]<<" ";
swap(a[1],a[i]); //交换堆顶和最后一个元素,即每次将剩余元素中的最大者放到最后面
//BuildHeap(a,i-1); //将余下元素重新建立为大顶堆
HeapAdjust(a,1,i-1); //重新调整堆顶节点成为大顶堆
}
}
int main(int argc, char *argv[])
{
//int a[]={0,16,20,3,11,17,8};
int a[100];
int size;
while(scanf("%d",&size)==1&&size>0)
{
int i;
for(i=1;i<=size;i++)
cin>>a[i];
HeapSort(a,size);
for(i=1;i<=size;i++)
cout<<a[i]<<" ";
cout<<endl;
}
return 0;
}
四:归并排序
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef int ElemType;
void TwoMerge(ElemType a[],ElemType b[],int m,int n,int t)
{
int i=m,j=n+1,k=m;
while(i<=n && j<=t)
{
if(a[i]<a[j])
{
b[k]=a[i];
i++;
}
else
{
b[k]=a[j];
j++;
}
k++;
}
while(i<=n)
{
b[k]=a[i];
i++;
k++;
}
while(j<=t)
{
b[k]=a[j];
j++;
k++;
}
}
void MergePass(ElemType a[],ElemType b[],int n,int len)
{
int p=0;
while(p+2*len-1<n)
{
TwoMerge(a,b,p,p+len-1,p+2*len-1);
p+=2*len;
}
if(p+len<n)
TwoMerge(a,b,p,p+len-1,n-1);
else
{
int i;
for(i=p;i<n;i++)
b[i]=a[i];
}
}
void MergeSort(ElemType a[],int n)
{
int len=1;
ElemType *b=new ElemType[n];
while(len<n)
{
MergePass(a,b,n,len);
len*=2;
MergePass(b,a,n,len);
len*=2;
}
free(b);
}
int main()
{
int n,i;
ElemType a[100000]={0};
printf("请输入要测试的数据的个数:");
while(1)
{
scanf("%d",&n);
if(n==0)
break;
srand(time(NULL));
for(i=0;i<n;i++)
a[i]=rand()%100000;
printf("原序:");
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n排序后:");
MergeSort(a,n);
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n***************************************\n");
}
return 0;
}