【算法系列-1】排序

来源:互联网 发布:淘宝清关信息在哪设置 编辑:程序博客网 时间:2024/05/09 02:36

1-冒泡排序

/**
 * 正宗的冒泡排序
 * 2012-12-17
 * 冒泡排序(BubbleSort)的基本概念是:
 * 依次比较相邻的两个数,将小数放在前面,大数放在后面。
 * 即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。
 * 然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。
 * 在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,
 * 一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。
 * 如此下去,重复以上过程,直至最终完成排序。
 * 评:每次选出一个最大的放在最后的位置?依此循环:最大 第二大 第三大 ...
 */


public class BubbleSort {public int[] bubbleSort(int[] array){for(int i=0; i<array.length -1; i++){for(int j=0; j<array.length -1 -i; j++){int temp =0;if(array[j] > array[j + 1]){temp = array[j];array[j] = array[j+1];array[j+1] = temp;}}}return array;}
时间复杂度:

冒泡排序总的平均时间复杂度为 O(n2)

空间复杂度:


2-快速排序

这是一个常用的排序方法

快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。

一趟快速排序的算法是:
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-完成的时候,此时令循环结束)。


public void quickSort(int[] arr, int left, int right){if(null == arr || arr.length == 0)return;if(left >= right)return;int first = left;int last = right;int key = arr[first];while(first < last){while(first < last && arr[last] >= key){--last;}/*将小的移到低端*/arr[first] = arr[last];while(first < last && arr[first] <= key){++first;}/*将大的移到高端*/arr[last] = arr[first];}arr[first] = key; //这个?/*用同样的方法对分出来的左边的小组进行同上的方法*/quickSort(arr, left, first -1);/*用同样的方法对右边的小组进行同上的做法*/quickSort(arr, first+1, right);}

【快速排序-算法步骤】

1 从数列中挑出一个元素,称为 “基准”(pivot),
2 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
3 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

时间复杂度:

快速排序之所以比较快,是因为相比冒泡排序,每次交换是跳跃式的。每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。这样在每次交换的时候就不会像冒泡排序一样只能在相邻的数之间进行交换,交换的距离就大得多了。因此总的比较和交换次数就少了,速度自然就提高了。当然在最坏的情况下,仍可能是相邻的两个数进行了交换。因此快速排序的最差时间复杂度和冒泡排序是一样的,都是O(N2),它的平均时间复杂度为O(NlogN)。


0 0
原创粉丝点击