快速排序
快速排序在平均状况下时间复杂度O(nlogn),快速排序法是冒泡排序的进化版本,在最差情况下他们的时间复杂度是一样的(O(n2)),但是在平均状况下其时间复杂度较冒泡排序更低,快速排序是一种不稳定的算法。
快速排序算法的思想:
上图有长度不相同次序混乱的条形图(可看作数组中大小不同的数据),选择任意一个位置的数据为出发点,例如选择第一条关键数据为红色箭头所指的数据,从数组最右侧开始与关键数据对比,如果小于关键数据,就把他放在关键数据的左边,如果大于关键数据,不做移动,比较移动完毕后,第一次遍历完毕,遍历玩所有数据就得到了有序数组
快速排序算法的代码实现:
public void sort(int[] data,int low,int hight)
{
if(low >= hight)
{
return;
}
int l = low;
int h = hight;
int[] list = data;
//默认比较的关键数字是key = list[l],记作key,在一次递归中,key的值是不变的,只是key的位置在改变
while(h>l)
{
if(list[h] < list[l]){
int tmp = list[h];
list[h] = list[l];
list[l] = tmp;
break;
}
h--;
}
while(l<h)
{
if(list[l] > list[h])
{
int tmp = list[l];
list[l] = list[h];
list[h] = tmp;
break;
}
l++;
}
sort(list, low, l-1);//递归 l是一个关键的数,它记录了最后一次移动后key所在的数组下标,只有确定了第一次排序完成后key的位置,
sort(list, l+1, hight);//才能确定接下来的递归排序所传递的参数
}
算法的排序在sort方法的两个while语句中,执行的是从数组结尾开始寻找,找在key右侧第一个小于key的数字,把他与key互换位置,然后再从数组起始位开始寻找,找到第一个比key的值大的,并且与key互换位置,l记录最后一次交换后的key的下标,这样每次排序完毕后,就能确定key关键字的左侧均是小于key的数,key关键字的右侧均是大于key的数。
递归函数的参数:
第一个sort函数,数组的第一个参数是待排序数组,第二个参数是下次排序的起始位置,第三个参数是带排序数组的结束部分(为key所在的下标-1)
第二个sort函数,数组的第一个参数是待排序数组,第二个参数是下次排序的起始位置,第三个参数是带排序数组的结束部分(为key所在的下标+1)
这样就把数组递归分割成多个待排序的数组直到待排序的数组的长度为1