快速排序
题目:输入一个字符串数组,使用快速排序进行排序;
eg:
["text","next","do"]
排序后
["do","next","text"]
一、快速排序的原理
快速排序其实就是快速的找到当前值在数组中的所在位置;
使用前后指针,low指向位置0,high指向lengh- 1位置;
开始排序:
1、将low指针指向的数值设置为基值tmp;
2、从high指针开始移动,当前数值大于基值tmp,high–;当前数值小于基值tmp,将high的值赋给low,low++;
3、low指针开始运动,当前数值小于基值tmp,low++;当前数值大于基值tmp,将low的值赋给high,
high–;
4、当high==low时,当前位置即是基数tmp的位置;
二、快速排序举例
1、设置当前数组中指针,low=72,high=85;
2、设置基数tmp,tmp=72;
3、从high指针开始移动,high=85,大于tmp,high–;
4、high=48,小于tmp,则low=48,low++,即ints[0] = 48;
5、low=6,小于tmp,low++;
6、low=57,小于tmp,low++;
7、low=88,大于tmp,则high=88,high–,即ints[8] = 88;
8、high=73,大于tmp,high–;
9、high=83,大于tmp,high–;
10、high=42,小于tmp,则low=42,low++;即ints[3]=42;
11、low=60,小于tmp,low++;
12、low=high,则当前位置为tmp的位置,即ints[5]=tmp;
找到当前基数72的准确位置,根据当前数值将数组分为三部分:1、小于基数;2、基数;3、大于基数;
将小于和大于基数的部分再次进行排序即可得到排序好的数组
三、代码
public class QuickSort {
public static void main(String[] args) {
String[] array={"text","aext","do"};
String[] strings = quick_sort(array);
for (String s:strings) {
System.out.println(s);
}
}
//判断数组的独特:是否为空||大小<=1
public static String[] quick_sort(String[] array) {
if (array == null || array.length <= 1) {
return array;
}
return AdjustArray(array, 0, array.length - 1);
}
//分治算法,分为三部分进行排序
public static String[] AdjustArray(String[] array, int low, int high) {
if (high <= low) {
return array;
}
//分为三部分:即分治算法
int tmp = quickSort(array, low, high);
AdjustArray(array, low, tmp - 1);
AdjustArray(array, tmp + 1, high);
return array;
}
//排序算法
public static int quickSort(String[] array, int low, int high) {
String tmp = array[0];
while (low < high){
while (low < high && array[high].compareTo(tmp)>=0){
high--;
}
if(low < high && array[high].compareTo(tmp) < 0){
array[low] = array[high];
low++;
}
while (low < high && array[low].compareTo(tmp) <= 0){
low++;
}
if(low < high && array[low].compareTo(tmp) >0){
array[high] = array[low];
high--;
}
}
array[low] = tmp;
return low;
}
}
四、时间和空间复杂度
最优情况下时间复杂度:O( nlogn )
最差情况下时间复杂度:O( n^2 )
平均情况下时间复杂度:O(nlogn)
平均情况下时间复杂度:O(nlogn)