目录
冒泡排序:
第一种写法:
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-1-i;j++)
{
if(a[j]>a[j-1])
swap(a[j],a[j-1]);
}
}
第二种写法:
for(int i=0;i<n-1;i++)
{
for(int j=i+1;j<n;j++)
{
if(a[i]>a[j])
{
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
选择排序:
//每次选择最小值或者最大值
int mindex;
for(int i=0;i<n-1;i++)
{
mindex=i;
for(int j=i+1;j<n;j++)
{
if(a[j]<a[mindex])
mindex=j;
}
if(mindex!=i)
swap(a[mindex],a[i]);
}
直接插入排序:
//就是往前看,出现后面比前面小的就换一下
for(int i=1;i<n;i++)
{
for(int j=i;j>0&&a[j]<a[j-1];j--)//如果a[j]>a[j-1]就不循环(前面的是已经排好序了,一旦出现a[j]>a[j-1]就说明前面的都比a[j]小,无需循环
swap(a[j],a[j-1]);
}
归并排序:
int a[100],temp[100],cnt;
void mergearray(int l,int mid,int r)
{
int i=l,j=mid+1,m=mid,k=0;
while(i<=m&&j<=r)
{
if(a[i]<a[j])
temp[k++]=a[i++];
else
temp[k++]=a[j++];
}
while(i<=m) temp[k++]=a[i++];
while(j<=r) temp[k++]=a[j++];
for(i=0;i<k;i++)
a[l+i]=temp[i];
}
void mergeSort(int l,int r)
{
if(l<r)
{
int mid=(l+r)>>1;
mergeSort(l,mid);
mergeSort(mid+1,r);
mergearray(l,mid,r);
}
}
堆排序:
一般如果是升序,用大顶堆,降序用小顶堆,下面的模板都是大顶堆,也就是升序。
第一种写法:
void creat_heap(int a[],int n,int index)
{
int record=a[index];
while(2*index+1<=n-1)
{
int maxindex=2*index+1;
if(2*index+2<=n-1&&a[2*index+2]>a[maxindex])
maxindex=2*index+2;
if(record<a[maxindex])
{
a[index]=a[maxindex];
index=maxindex;
}
else break;
}
a[index]=record;
}
void heap_sort(int a[],int n)
{
for(int i=n>>1-1;i>=0;i--)
creat_heap(a,n,i);
for(int i=n-1;i>=0;i--)
{
swap(a[i],a[0]);
creat_heap(a,i,0);
}
}
第二种写法:
void maxHeapDown(int begin,int end)
{
int c=begin;
for(int l=2*c+1;l<=end;c=l,l=2*l+1)
{
if(l<end&&a[l]<a[l+1]) l++;
if(a[c]>=a[l]) break;
else swap(a[c],a[l]);
}
}
void heapSort(int n)
{
for(int i=n>>1-1;i>=0;i--)
maxHeapDown(i,n-1);
for(int i=n-1;i>0;i--)
{
swap(a[0],a[i]);
maxHeapDown(0,i-1);
}
}