快速排序时间复杂度是n*Logn。
原理:
1.从一组数中选取一个,将数组根据选取的那个数分成三部分:左边比它小,等于它,右边比它大。
2.对 左边和右边分别按1方法继续分。然后在将新分出来的左边右边继续分
3.直到左边或右边的数组大小为1.
一直觉得汉语表达能力不行,还是看代码吧:
class QuickSorter
{
public bool Sort(ref int[] numbers, int arrSize)
{
QuickSort(ref numbers, 0, arrSize - 1);
return true;
}
private void QuickSort(ref int[] numbers, int start, int end)
{
if (start < end)
{
int middleIdx = Split(ref numbers, start, end);
//递归
//左边
QuickSort(ref numbers, start, middleIdx-1);
//右边
QuickSort(ref numbers, middleIdx + 1, end);
}
}
//分裂 返回左边最后一个的位置
private int Split(ref int[] numbers,int start, int end)
{
int middleIdx = -1;
int totalCount = end - start + 1;
if (totalCount < 0)
return middleIdx;
Random random=new Random();
//随机一个index;
middleIdx = random.Next(totalCount) + start;
//将middle的元素移动到第一位
Swap(ref numbers,start,middleIdx);
//设置中间元素位置为第一位
middleIdx = start;
int totalLeft = doSplit(ref numbers, start, end, middleIdx);
return totalLeft + start;;
}
//分成两部分,返回被分在左边部分的个数
private int doSplit(ref int[] numbers, int start, int end, int middleIdx)
{
int middleNum = numbers[middleIdx];
int totalLeft = 0;
for (int i = start; i <= end; i++)
{
//发现比middleNum 小的数,它应该被分到左边
if (numbers[i] < middleNum)
{
middleIdx = start + totalLeft;
SwapMiddle(ref numbers, middleIdx, i);
totalLeft++;
}
}
return totalLeft;
}
//交换
private void Swap(ref int[] numbers, int idx1, int idx2)
{
if (idx1 == idx2)
return;
int temp = numbers[idx1];
numbers[idx1] = numbers[idx2];
numbers[idx2] = temp;
}
//将idx1 idx1+1 idx2 交换。
private void SwapMiddle(ref int[] numbers, int idx1, int idx2)
{
if (idx1 == idx2)
return;
int tempidx2= numbers[idx2];
numbers[idx2] = numbers[idx1 + 1];
numbers[idx1 + 1]=numbers[idx1];
numbers[idx1] = tempidx2;
}
}