快速排序算法是目前为止排序算法中教好的一种,时间复杂度为O(n*logn)
下面先简单的写下,以后有时间再更新!欢迎大家的交流!
其思想是:
- 一趟的思想:先在数组中选择一个数字,接下来把数组中的数字分为两个部分,比选择的数字小的数字在数组的左边,比选择的数字大的数字在右边
- 递归的思路分别对于每次选中的数字的左右两边排序
第一步:实现分割的代码:有两种方式,看大家谢欢!
定义的两个指针顺序的朝着同一个方向:
int Partition(int data[], int length, int start, int end){
if (data == NULL || length <= 0 || start < 0 || end >= length)
throw new std::exception("Invalid Parameters");
int index = RandomInRange(start, end);
Swap(&data[index], &data[end]);
int small = start -1;
for (index = start; index < end; ++index){
if(data[index] < data[end]){
++small;
if(small != index)
Swap(&data[index], &data[end]);
}
}
++small;
Swap(&data[small], &data[end]);
return small;
}
int Partition(int data, int length, int start, int end){
if (data == NULL || length <= 0 || start < 0 || end >= length)
throw new std::exception("Invalid Parameters");
int pLeft = randomInRange(start, end);
Swap(&data[pLeft], &data[end]);
pLeft = start -1;
int pRight = end;
for(;;){
while(data[++pLeft] < data[end]){};
while(data[--pRight] > data[end]){};
if(pLeft < pRight)
Swap(&data[pLeft], &data[pRight]);
else
break;
}
Swap(&data[pLeft], &datap[end]);
return pLeft;
}
int middle3(int data, int length, int start, int end){
if (data == NULL || length <= 0 || start < 0 || end >= length)
throw new std::exception("Invalid Parameters");
int center = (start+end)/2;
if(data[start] > data[center])
Swap(&data[start], &data[center]);
if(data[center] > data[end])
Swap(&data[center], &data[end])
if(data[start] > data[center])
Swap(&data[start], &data[center]);
Swap(&data[center], &data[end]); //将中间的分割数,交换到数组最后面
}
下面我们可以用递归的思想分别对于每次选中的数字左右两边进行排序。
void QuickSort(int data[], int length, int start, int end){
if(start == end)
return;
int index Partition(data, length, start, end);
if(index > start)
QuickSort(data, length, start, index-1);
if(index < end)
QuickSort(data, length, index+1, end);
}
代码可能有地方有问题,后期有时间我会测试修改!