快速排序
我理解的快排就是找到一个数组中的一个值作为key值,从前往后与key比较,再从后往前与key值比较,(从小到大排序)key值左边的都是小于key的值,右边的都是大于key的值,两边不满足条件时交换两个数的位置arr[low]与arr[high],通过key值作为分界线,分成两部分,左边比右边的小。把左右两边的元素继续排序,直到所有元素都排列好。(“数组”中只有两个元素时,排列结束low==high退出循环)left与right相等不会继续执行。
public static void MySort(int[] arr, int left, int right)
{
if (left < right)
{
int low = left;
int high = right-1;
int key = arr[(low + high) / 2];
while (true)
{
// 从左到右判断 小的数小于key值low++继续向右判断
while (arr[low] < key && low < right)
{
low++;
}
// 从右到左判断 大的数大于key值high--向左判断
while (arr[high] > key && high > 0)
{
high--;
}
// 左右两边相等就是同一个数了跳出
if (low == high) break;
// 不通过新的变量交换两个数
arr[low] = arr[low] + arr[high];
arr[high] = arr[low] - arr[high];
arr[low] = arr[low] - arr[high];
// 防止数重复的时候进入死循环
if (arr[low] == arr[high]) low++;
}
// 调整key值左边的数顺序 左边的数都比key小(重复直到所有数都排好顺序)递归
MySort(arr, left, low);
// 调整key值右边的数的顺序
MySort(arr, low + 1, right);
}
}
如果我有没考虑到的条件或者错误,请大佬指出来。谢谢啦。