`

常见排序算法总结

阅读更多

冒泡排序:

冒泡排序介绍:
冒泡排序(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;//插入
		}
	}
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics