【复习总结】一些简单的排序算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shangdi712/article/details/47252733
1.  冒泡排序,冒泡排序属于简单排序的一种,也是大多数人学会的第一个排序算法,其基本思想是,从左到右扫描每个数据,跟它相邻的比较,如果大小顺序不对,就交换两个数据的位置,这种算法的最坏时间复杂度为n^2,属于稳定排序的一种,然而,冒泡排序由于时间复杂度比较高,所以往往并不是最优算法,然而,它有一个别的算法所不具备的优点就是,能够方便的对链表进行排序,该算法的代码如下:
void Bubble_Sort(int A[],int N)
{
       for(int i=0;i<N;++i)
       {
             for(int j=0;j<i;++j)
             {
                  if(A[j]>A[j+1])
                  {
                         int temp=A[j];
                         A[j]=A[j+1];
                         A[j+1]=temp;
                   }
             }
        }
}         
2. 插入排序,插入排序原理,就像我们平时打扑克,整理牌一样,抓一张,跟手里最右面一张比,比第一张小,第一张向右移动一下,然后再跟第二张比,找到合适位置,就将其插进去,这种算法也是属于简单算法的一种,最坏的时间复杂度为n^2 ,也是一种效率比较低的排序,然而,插入排序的意义,在我理解,应该是作为希尔排序的基础,该算法代码如下:
void insert_sort(int ElementType[],int N)
{
	for (int i = 1; i < N; ++i)
	{
		int temp = ElementType[i];
		for (int j = i; j>0 && ElementType[j - 1] > temp; --j)
		{
			ElementType[j] = ElementType[j - 1];
			ElementType[j - 1] = temp;
		}
	}
}

3.选择排序,选择排序 的原理是,从i开始,到最后,找最小的,交换最小的和i位置的数据,i就是第一次循环的循环控制变量,这种排序最坏时间复杂度也是n^2,选择排序是作为堆排序的基础,由选择排序可以演化为堆排序,实现代码如下:

int ScanForMin(int ElementType[], int start,int end)
{
	int result = 0;
	int temp = ElementType[0];
	for (int i = start; i < end; ++i)
	{
		if (ElementType[i] < temp)
		{
			temp = ElementType[i];
			result = i;
		}
	}
	return result;
}

void swap(int &a, int &b)
{
	int temp;
	temp = a;
	a = b;
	b = temp;
}
void selection_sort(int ElementType[], int N)
{
	for (int i = 0; i < N; ++i)
	{
		int MinPosition = ScanForMin(ElementType, i, N-1 );
		if (MinPosition!=i)
			swap(ElementType[i], ElementType[MinPosition]);
	}
}

希尔排序,希尔排序的原理是,先比较相隔N个的元素的大小,然后缩小N的值,再来一遍,比如,第一次,每个五个比一次,第二次,每隔三个比一次,最后一次,再比较相邻两个,比较相邻两个的时候,整个数组已经基本有序了,当然理想情况下是基本有序,存在一种情况,前几次排序并没有使顺序发生任何变化,白做了几次循环,使得时间复杂度异常大,超过冒泡和插入,所以,SedgeWick提出一种希尔增量,增量使用4^i-3*2^i+1这个公式 算出,使最坏时间复杂度降为 n^(4/3),而平均时间复杂度只是个理论值为: n^(7/6)但是,这种希尔排序,在大量数据排序时,确实是效率相当高的,SedgeWick增量希尔排序实现代码如下:
int sedgewick[] = {  // Sedgewick增量 4^i-3*2^i+1
	1073643521, 603906049, 268386305, 150958081, 67084289,
	37730305, 16764929, 9427969, 4188161, 2354689,
	1045505, 587521, 260609, 146305, 64769,
	36289, 16001, 8929, 3905, 2161,
	929, 505, 209, 109, 41,
	19, 5, 1, 0 };

void Shell_Sort(int ElementType[], int N)
{
	for (int *i = sedgewick; *i > N;i++)
	{
		for (int j = 1; j < N; ++j)
		{
			int temp = ElementType[j];
			for (int k = j; k>0 && ElementType[k - 1]>temp; --k)
			{
				ElementType[k] = ElementType[k - 1];
				ElementType[k - 1] = temp;
			}
		}
	}
}

猜你喜欢

转载自blog.csdn.net/shangdi712/article/details/47252733