选择排序还是比较复杂的,时间复杂度是,快但是不稳定。
思路:
给一组数组,把数组拆成两部分,一部分是大的,一部分是小,而拆分的基准一般选择为未排序的第一个数,之后通过递归,在小的部分继续排序,在大数部分继续排序。
选择两个位置做标记,告诉递归,我要从哪排到哪,即传入的参数为 start 和 end , 递归的条件则是start < end,这样排序才会进行。
具体实现:
用一个变量作为标准数,用两个 标志 记录需要排序的下标。
开始 while 循环找比标准数大的数,比标准数小的数。
代码:
public static void quickSort(int[] arr,int start,int end) {
if (start
//选一个基准数
int standard = arr[start];
//记录需要排序的下标
int low = start;
int hight = end;
//循环找比标准数大的数,比标准数小的数
while (low < hight) {
//右边的数字比标准数更大
while (low < hight && standard <= arr[hight]) {
hight--;
}
//使用右边的数字替换左边的数
arr[low] = arr[hight];
//如果左边的数字比标准数小,不用动,下标往前走
while (low < hight && arr[low] <= standard) {
low++;
}
//如果左边的数大于标准数,使用左边的数字代替右边的数字
arr[hight] = arr[low];
}
//把标准数赋给所在的位置的元素
arr[low] = standard;
//处理所有小的数字
quickSort(arr, start, low);
//处理所有大的数字
quickSort(arr, low +1, end);
}
}
网友评论