排序的模板【氣泡排序、選擇排序、直接插入排序、歸併排序、堆排序】(還有排序後面繼續補)
阿新 • • 發佈:2018-12-11
目錄
氣泡排序:
第一種寫法:
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);
}
}