您的位置:首页 > 编程语言 > Java开发

快速排序(java)

2015-07-30 12:34 375 查看
各种排序算法里快速排序的平均时间复杂度最好,最近专门去理解了一下快速排序,现在记录如下:

public static void quickSort(int[] array, int low, int height) {

int i = low;
int j = height;
int temp = array[i];
while (i < j) {
while (i < j && temp < array[j]) {
j--;
}
array[i] = array[j];

while (i < j && temp > array[i]) {
i++;
}
array[j] = array[i];
}

array[i] = temp;

if (low < i) {
quickSort(array, low, i - 1);
}

if (i < height) {
quickSort(array, i + 1, height);
}

}
while(i < j)这样一个循环结束我们称之为一次快速排序,一次快速排序开始会首先选择一个数组元素作为关键字,上面的程序选择关键字使用的是当前数组的第0个元素,while循环开始,首先从数组的最右边开始比较,如果最右边元素大于关键字则不做交换,只是把j++,直到找到右边元素有小于关键字的为止。如果小于关键字则把当前元素赋值给左边的空位。然后进入左边,左边类同,直到while(i<j)循环结束,然后temp找到自己的位置。快速排序在最好状态下的时间复杂度是O(nlgn),最好状态也就是说每一次快速排序我们选择的关键字在这一次快排结束后都会放在当前数组的中间位置,称之为快速排序最好的状态。



接下来针对具体的数组说一下快速排序的过程,上图的数组是特殊设计的,每次选择的关键字都是恰巧放在中间位置。选中数组第一个元素为比较关键元素,首先拿关键元素6 去数组的末尾比较,所有大于关键字的元素都往数组后半部分放,所有小与关键字的元素往数组前半部分放。6与10,6与11,6与7,6与8,6与9比较,数组都不发生变化,知道比较到3,所以将3放到6的位置,然后6与2,6与1,6与5,6与4,全部小于关键字,数组不发生改变,最后i > j 循环结束,6找到自己的位置,放在原来3的位置,也就是数组的中间。然后6的左边数组和6的右边数组分别进行上一次的排序,如图。接下来我们就分析一下在最好状态下的时间复杂度是怎么得来的。

假设数组元素个数为n,第一次快速排序,选择数组一个元素作为比较的关键字,第一次快速排序结束,关键字找到自己的位置正好在数组的中间,然后第二次快速排序,把第一次排序结束之后的数组关键字位置左边部分和右边部分分别进行快速排序,以此类推,每一个子数组的书目都是上一次数组的1/2。根据上图,每一行不管被2除以多少次总的比较次数都是n。那么问题就变成了,n被除以多少次刚好大于1,就变成求2的多少次方刚好小于或者等于n,也就是log以2为底n的对数次即lgn,而n最多被除以这么多次,而每次比较n次所以,总的比较次数就是:nlgn。快速排序是一种不稳定的排序,在最坏的情况下,也就是一个已经不乱序的情况下,比如是从小到大排序的我们需要把它变成从大到小,那么这样一种情况快速排序的时间复杂度为O(n的平方),当然这样一种情况几乎是不会放生的,因为不论从大到小还是从小到大都是一种有序,应该会很少碰到需要颠倒顺序的需求吧!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息