欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

常见排序算法总结

程序员文章站 2022-05-28 13:57:11
...

冒泡排序:

冒泡排序介绍:
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换的元素,也就是说该数列已经排序完成。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,就像冒泡一样,因此称之为冒泡排序。

冒泡排序算法原理:
1、比较相邻的两个元素。如果第一个元素比第二个元素大,就交换他们两个元素。
2、对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。按照这个策略执行一趟后,最后的元素会是最大的数。
3、将最后一个元素排除在外,针对其余的所有元素重复以上两步的操作步骤。
4、持续对越来越少的元素重复上面的操作步骤,直到没有任何一对元素需要比较。

冒泡排序最好的时间复杂度为O(N),最坏的时间复杂度为O(N²),因此冒泡排序总的平均时间复杂度为O(N²)。

/**
 * 冒泡排序算法实现
 * @param destArray 待排序的无序数组  如:65 27 59 64 58 
 */
public static void bubbleSort(int[] destArray)
{
	for(int i = 0;i < destArray.length;i++)
	{
	   for(int j = i;j < destArray.length;j++)
	   {
	      if(destArray[j] < destArray[i])
	      {
		     int temp = destArray[i];
		     destArray[i] = destArray[j];
		     destArray[j] = temp;
	      }
	   }
	}
}

快速排序:
快速排序介绍:
快速排序(Quick Sort)是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

快速排序算法原理:
设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
一趟快速排序的算法是:
1、设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2、以第一个数组元素作为关键数据,赋值给key,即key=A[0];
3、从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换;
4、从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;
5、重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i,j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。

快速排序最好的时间复杂度为O(NlogN),最坏的时间复杂度为O(N²),因此快速排序总的平均时间复杂度为O(NlogN)。

/**
 * 快速排序算法实现
 * @param destArray 待排序的无序数组  如:65 27 59 64 58
 * @param low 数组的低index
 * @param high 数组的高index
 */
public static void quickSort(int[] destArray, int low, int high)
{
	if(low >= high)
	{
		return;
	}
	
	int first = low;
	int last = high;
	int key = destArray[first];
	
	while(first < last)
	{
		while(first < last && destArray[last] >= key)
		{
			last--;
		}
		destArray[first] = destArray[last];//将比第一个小的移到低端
		
		while(first < last && destArray[first] <= key)
		{
			first++;
		}
		destArray[last] = destArray[first];
	}
	
	destArray[first] = key;
	quickSort(destArray, low, first - 1);
	quickSort(destArray, first + 1, high);
}

插入排序:
插入排序介绍:
插入排序(Insert Sort)它的基本思想是:输入一个元素,检查数组列表中的每个元素,将其插入到一个已经排好序的数列中的适当位置,使数列依然有序,当最后一个元素放入合适位置时,该数组排序完毕。
插入排序算法原理:
输入一个数,插入一个各元素已经按照升序排列的数组中,插入后使数组中元素仍然是按照升序排列的。思想:把欲插入的数与数组中各数逐个比较,当找到第一个比插入数大的元素i时,该元素之前即为插入位置。然后从数组最后一个元素开始到该元素为止,逐个后移一个单元。最后把插入数赋予元素a[i]即可。如果被插入数比所有的元素值都小则插入最前位置。
插入排序最好的时间复杂度为O(N),最坏的时间复杂度为O(N²),因此冒泡排序总的平均时间复杂度为O(N²)。

/**
 * 插入排序算法实现(由前向后)
 * @param destArray 待排序的无序数组  如:65 27 59 64 58 
 */
public static void insertSort(int[] destArray)
{
	//从第2个数据开始插入,因此这里从i=1开始
	for(int i = 1;i < destArray.length;i++)
	{
		int j = 0;
		//寻找要插入的位置
		while(j < i && destArray[j] <= destArray[i])
			j++;
		
		//i位置之前,有比destArray[i]大的数,则进行挪动和插入
		if(j < i)
		{
			int k = i;
			int temp = destArray[i];
			
			//挪动位置
			while(k > j)
			{
				destArray[k] = destArray[k-1];
				k--;
			}
			destArray[k] = temp;//插入
		}
	}
}

 

相关标签: 排序算法