几种排序算法实现

class Sort
{
public:
	Sort(void);
	~Sort(void);

public:
	inline void Swap(int &a,int &b);
	//冒泡排序
	void BubbleSort(int a[],int n);
	//直接插入排序
	void InsertSort(int a[],int n);
	//希尔排序
	void SellSort(int a[],int n);
	//直接选择排序
	void SelectSort(int a[],int n);
	//归并排序
	bool MergeSort(int a[],int n);
	void mergesort(int a[],int first,int last,int temp[]);
	void mergearray(int a[],int first,int mid,int last,int temp[]);
	//快速排序
	void QuickSort(int a[],int l,int r);
};
#include "Sort.h"
#include <stdio.h>

Sort::Sort(void)
{
}


Sort::~Sort(void)
{
}

//交换两个数
inline void Sort::Swap(int &a,int &b)
{
	int temp=a;
	a=b;
	b=temp;
}

//冒泡排序
//1.比较相邻的前后两个数据,如果前面的数据大于后面的数据,就将两个数据交换。
//2.这样对数组的第0个数据到n-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第n-1个位置。
//3.n=n-1,如果n不为0就重复前面两步,否则排序完成。
void Sort::BubbleSort(int a[],int n)
{
	int i,j;
	for (i=0;i<n;i++)
	{
		for (j=1;j<n-i;j++)
		{
			if (a[j-1]>a[j])
			{
				Swap(a[j-1],a[j]);
			}
		}
	}
}

//直接插入排序
//1.初始时,a[0]自成1个有序区,无序区为a[1...n-1],令i=1
//2.将a[i]并入当前的有序区a[0...i-1]中形成a[0...i]的有序区
//3.i++并重复第二步直到i==n-1,排序完成
void Sort::InsertSort(int a[],int n)
{
	int i,j,temp;
	for (i=1;i<n;i++)
	{
		if (a[i]<a[i-1])
		{
			temp=a[i];
			for (j=i-1;j>=0 && a[j]>temp;j--)
			{
				a[j+1]=a[j];
			}
			a[j+1]=temp;
		}
	}
}

//希尔排序
//先将整个待排序元素序列分割成若干个子序列分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序时(增量足够小)时,再对全体元素进行一次直接插入排序。
void Sort::SellSort(int a[],int n)
{
	int i,j,gap;
	for (gap=n/2;gap>0;gap/=2)
	{
		for (i=gap;i<n;i++)
		{
			for (j=i-gap;j>=0 && a[j]>a[j+gap];j-=gap)
			{
				Swap(a[j],a[j+gap]);
			}
		}
	}

}

//选择排序法
//1.初始时,数组全为无序区,令i=0
//2.在无序区中选一个最小的元素,将其与a[i]交换。交换之后a[0...i]就成了一个有序区
//3.i++,并重复第二步知道i==n-1,完成排序
void Sort::SelectSort(int a[],int n)
{
	int i,j,MinIndex;
	for (i=0;i<n;i++)
	{
		MinIndex=i;
		for (j=i+1;j<n;j++)
		{
			if (a[j]<a[MinIndex])
			{
				MinIndex=j;
			}
		}
		Swap(a[i],a[MinIndex]);
	}
}

//归并排序
bool Sort::MergeSort(int a[],int n)
{
	int *p=new int[n];
	if (p==NULL)
	{
		return false;
	}
	mergesort(a,0,n-1,p);
	delete[] p;
	return true;

}

void Sort::mergesort(int a[],int first,int last,int temp[])
{
	if (first<last)
	{
		int mid=(first+last)/2;
		mergesort(a,first,mid,temp);//左边有序
		mergesort(a,mid+1,last,temp);//右边有序
		mergearray(a,first,mid,last,temp);//再将两个有序数列合并
	}

}

void Sort::mergearray(int a[],int first,int mid,int last,int temp[])
{
	int i=first,j=mid+1;
	int m=mid,n=last;
	int k=0;
	while(i<=m && j<=n)
	{
		if (a[i]<a[j])
		{
			temp[k++]=a[i++];
		}
		else
			temp[k++]=a[j++];
	}
	while(i<=m)
		temp[k++]=a[i++];
	while(j<=n)
		temp[k++]=a[j++];
	for (i=0;i<k;i++)
	{
		a[first+i]=temp[i];
	}
}

//快速排序
void Sort::QuickSort(int a[],int l,int r)
{
	if (l<r)
	{
		int 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;//此时i=j
		QuickSort(a,l,i-1);//递归调用
		QuickSort(a,i+1,r);
	}
}


几种常见排序 基于比较的排序算法: 下界是 nlgn 1.1 SelectionSort:每次选出最下的元素,放在当前循环最左边的位置。 1.2 BubbleSort:每次比较相邻的两个数,使得最大的数像气泡一样冒到最右边。 1. 3 InsertionSort:每次拿起一个数,插入到它左边数组的正确位置。 1.4 QuickSort:选择一个数,作为标准,小于它的放在左边,大于它的放在右边。并把它放在中间;递归地对左右子数组进行排序。 实现时:1. 确定递归结束条件,初始化左右游标, 选择标准数; 2. while循环,do while实现两个游标同时向中间移动,置换; 3. 置换标准数和右边游标所指的数; 4. 递归调用,对左右子数组进行排序。 1. 5 HeapSort:用最大堆实现实现时:建堆:置换堆顶元素和最后一个元素,堆大小减少,保持新的堆为最大堆; 保持最大堆: 从底向上依次保持最大堆,从第一个父节点到根部。 1.6 MergeSort:拆分数组,递归实现排序,二路归并。用哨兵来阻止游标的越界。 线性时间运行的算法: 1.7 CountingSort: 假设数据分布在0到k之间的。对于每个输入x,确定出小于x的数的个数。假设小于x的数有17个,那么x就应该在第18个输出位置。 1. 8 Radix sort(基数排序):从最低位开始,每位采用稳定的排序算法(如计数排序)。 1.9 Bucket sort:当输入数据比较均匀时采用。 先将数据区间分为n个桶,把数据分放到对应的桶中;对桶内的数据采用插入排序;再把各个桶的排序结果串起来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值