快速排序
方法:从左边开始找比基准值大的元素,从右边找比基准值小的元素,交换两个元素
缺点:如果所给元素序列为逆序的,那么快速排序的时间复杂度很糟糕。
长序列对递归排序来说不友好。
时间复杂度:平均O(NlogN),最坏O(N)
空间复杂度:最坏O(N);
稳定性:不稳定排序
int _QuicSort(int arr[], int beg, int end){
if ((end-beg) <= 1){
return beg;
}
int left = beg;
int right = end;
int key = arr[right];//基准值
while (left < right){
while (left < right&&arr[left] <= key){
++left;
}
while (left < right&&arr[right] >= key){
--right;
}
if (left < right){
swap(&arr[left], &arr[right]);
}
}
//最后把基准值和left指向的位置交换
swap(&arr[left], &arr[end]);
return left;
}
void QuicSort(int arr[], int beg,int end){
if ((end - beg) <= 1){
return ;
}
int mid = _QuicSort(arr, beg,end);
QuicSort(arr, beg, mid-1);
QuicSort(arr, mid + 1, end);
}
2.挖坑法
和上面的代码基本一样,不同点_QuicSort函数实现上
int _QuicSort(int arr[], int beg, int end){
if ((end - beg) <= 1){
return beg;
}
int left = beg;
int right = end;
int key = arr[end];
while (left < right){
while (left < right&&arr[left] <= key){
left++;
}
if (left < right){
arr[right]=arr[left];
}
while (left < right&&arr[right] >= key){
right--;
}
if (left < right){
arr[left] = arr[right];
}
}
arr[left] = key;
return left;
}