給有需要的人-十大排序算法上(冒泡排序 選擇排序 插入排序 希爾排序 堆排序 )

插一下小孱弱弱總結的十個排序算法,今天分享前五個。思想無比重要哦!!

#include <iostream>
#include <cstdlib>
#include <windows.h>
#include <time.h>
using namespace std;

#define MAXN 10
typedef struct
{
	int r[MAXN+1];
	int length;
}SqList;
void swap(SqList *L,int i,int j)
{
	int temp=L->r[i];
	L->r[i]=L->r[j];
	L->r[j]=temp;
}

//一、冒泡算法 平均時間複雜度O(n^2) 最壞時間複雜度O(n^2) 
//空間複雜度 O(1) 穩定
//1.1冒泡思想 
void BubbleSort1(SqList *L)
{
	int i,j;
	for(i=1;i<L->length;i++)
		for(j=i+1;j<L->length;j++)
		{
			if(L->r[i]>L->r[j])
				swap(L,i,j);
		}
	
}
//1.2冒泡算法*
void BubbleSort2 (SqList *L)
{
	int i,j;
	for(i=1;i<L->length;i++)
		for(j=L->length-1;j>=i;j--)
		{
			if(L->r[j]>L->r[j+1])
				swap(L,j,j+1);
		}

}
//1.3冒泡改進
void BubbleSort3(SqList *L)
{
	int i,j;
	bool flag=true;
	for(i=1;i<L->length&&flag;i++)
	{
		flag=false;
		for(j=L->length-1;j>=i;j--)
		{
			if(L->r[j]>L->r[j+1])
			{
				swap(L,j,j+1);
				flag=true;
			}
		}
	}	
} 
//二、選擇排序  平均時間複雜度O(n^2) 最壞時間複雜度O(n^2) 
//空間複雜度 O(1) 數組不穩定 鏈表穩定
void SelectSort(SqList *L) 
{
	int i,j,min;
	for(i=1;i<L->length;i++)
	{
		min=i;
		for(j=i+1;j<=L->length;j++)
		{
			if(L->r[min]>L->r[j])
				min=j;
		}
		if(i!=min)
			swap(L,i,min);	
	}
	
}
//三、插入排序 平均時間複雜度O(n^2) 最壞時間複雜度O(n^2) 
//空間複雜度 O(1) 穩定
void InsertSort(SqList *L)
{
	int i,j;
	for(i=2;i<=L->length;i++)
	{
		if(L->r[i]<L->r[i-1])
		{
			L->r[0]=L->r[i];
			for(j=i-1;L->r[j]>L->r[0];j--)//插入位置之後的元素向後移動一位 
				L->r[j+1]=L->r[j];
			L->r[j+1]=L->r[0];
		}	
	}
} 
//四、希爾排序 平均時間複雜度O(n*logn) 最壞時間複雜度O(n^2) 
//空間複雜度 O(1) 不穩定
void ShellSort(SqList *L)
{
	int i,j;
	int increment=L->length;
	do
	{
		increment=increment/3+1;//增量序列
		for(i=increment+1;i<=L->length;i++)
		{
			if(L->r[i]<L->r[i-increment])
			{
				L->r[0]=L->r[i];
				for(j=i-increment;j>0&&L->r[0]<L->r[j];j-=increment)
					L->r[j+increment]=L->r[j];
				L->r[j+increment]=L->r[0];
				
			}
		} 
	}
	while(increment>1);
} 
//五、堆排序 平均時間複雜度O(n*logn) 最壞時間複雜度O(n*logn) 
//空間複雜度 O(1) 不穩定
//堆調整函數
void HeapAdjust(SqList *L,int s,int m)
{
	int temp,j;
	temp=L->r[s];
	for(j=2*s;j<=m;j*=2)
	{
		if(j<m&&L->r[j]<L->r[j+1])
			j++;
		if(temp>=L->r[j])
			break;
		L->r[s]=L->r[j];
		s=j;
	}
	L->r[s]=temp;	
} 
//堆排序(遞歸方法)
void HeapSort(SqList *L)
{
	int i;
	for(i=L->length/2;i>0;i--)
		HeapAdjust(L,i,L->length);
	for(i=L->length;i>1;i--)
	{
		swap(L,1,i);
		HeapAdjust(L,1,i-1);
	}

 } 

int main ()
{
	SqList sq;
	srand(time(NULL));
	sq.length=10;
	
	for(int i=1;i<sq.length;i++)
	{
		sq.r[i]=rand()%100+1;
	} 
	//BubbleSort1(&sq);
	//BubbleSort2(&sq);
	//BubbleSort2(&sq);
	//SelectSort(&sq) ;
	//InsertSort(&sq);
	//ShellSort(&sq);
	HeapSort(&sq);
	for(int i=1;i<sq.length;i++)
	{
		cout<<sq.r[i]<<' ';
	}
	
	
	
	return 0;
 } 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章