1、算法描述
快速排序是冒泡排序的一种改进。快速排序是通过一次排序将待排序列分成两部分,一部分小于等于基准数,一部分大于等于基准数,再分别对两部分进行快速排序。
一趟快速排序的操作步骤
(1)、设置两个变量i和j,i=0,j=n-1。(2)、以data[0]为基准数,mark=data[0]
(3)、j向前搜索(j--),找到第一个小于基准数mark的数data[j],交换data[j]与data[i]
(4)、i向后搜索(i++),找到第一个大于基准数mark的数data[i],交换data[i]与data[j]
(5)、重复(3)(4),直到i等于j
2、图例
3、代码public void sort(int[] data) { quickSort(data, 0, data.length - 1); } private void quickSort(int[] data, int begin, int end) { int i = partition(data, begin, end); if (i > begin) quickSort(data, begin, i); if (end > i + 1) quickSort(data, i + 1, end); } private int partition(int[] data, int begin, int end) { int mark = data[begin]; while (begin != end) { while (data[end] >= mark && begin != end) { end--; } if (begin == end) break; swap(data, begin, end); while (data[begin] <= mark && begin != end) { begin++; } if (begin == end) break; swap(data, begin, end); } return begin; }
4、稳定性及复杂度稳定性:快速排序是不稳定的排序。平均时间复杂度:O(nlongn)
快速排序的最好情况发生在每次划分都将需要排序的序列分成大小相等的子序列时,时间复杂度为O(nlongn)
快速排序的最坏情况发生在每次划分都将需要排序的序列分成1和n-1大小的序列,时间复杂度为O(n^2)
空间复杂度:O(longn)