1. 程式人生 > >排序的模板【氣泡排序、選擇排序、直接插入排序、歸併排序、堆排序】(還有排序後面繼續補)

排序的模板【氣泡排序、選擇排序、直接插入排序、歸併排序、堆排序】(還有排序後面繼續補)

目錄

氣泡排序:

選擇排序:

歸併排序:

堆排序:

氣泡排序:

第一種寫法:

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);
	}
}