实现快速排序只要11行代码哦~
无他,唯手熟尔
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
//归并排序
void sort(int* nums, int start, int end){
int mid = (start + end) / 2;
if(mid == start) return;
sort(nums, start, mid);
sort(nums, mid, end);
int* buf = new int[end - start];
for(int i = start, j = mid, k = 0; i < mid || j < end; k++){
if(i < mid && (j >= end || nums[i] < nums[j])){ //这是取左边的条件
buf[k] = nums[i];
i ++;
}else{
buf[k] = nums[j];
j ++;
}
}
for(int i = 0; i < (end - start); i++){
nums[start + i] = buf[i];
}
delete[] buf; //如果上边越界,将导致delete失败,程序直接结束
}
//归并排序的循环实现
void sortLoop(int* nums, int start, int end){
int jmp = 2; //每隔jmp个数归并一次
int len = end - start;
int* buf = new int[len];
while( jmp / 2 <= len){
for(int i = start; i < end; i += jmp){
int mid = i + (jmp / 2);
int end2 = i + jmp > end ? end : i + jmp;
for(int a = i, b = mid, k = i; k < end2; k++){
if(a < mid && (b >= end2 || nums[a] < nums[b])){
buf[k] = nums[a];
a++;
}else{
buf[k] = nums[b];
b++;
}
}
for(int a = i; a < end2; a++){
nums[a] = buf[a];
}
}
jmp = jmp << 1;
}
delete[] buf;
}
//快速排序
void qsort(int* nums, int start, int end){
if(start >= end - 1) return;
int i = start, j = end - 1 , base = nums[start]; //用base保存基准值
while(i != j){
while(i < j && nums[j] >= base) j--; //从后半部分开始扫描
nums[i] = nums[j];
while(i < j && nums[i] <= base) i++;
nums[j] = nums[i];
}
nums[i] = base;
qsort(nums, start, i);
qsort(nums, i + 1, end);
}
int main()
{
int nums[] = {9, 8, 7, 5, 6, 7, 666, 3, 2, 1, 67, 1, 5, 100, 1000, 20, 6, 1, 666};
//sort(nums, 0, 16);
//sortLoop(nums, 0, 19);
qsort(nums, 0, 19);
for(int i = 0; i < 19; i++){
cout << nums[i] << " ";
}
cout << endl;
return 0;
}
运行结果