快速排序
快速排序:以一个元素为准,将序列分成左小右大,然后递归
在序列完全无序的情况下效率最高
思路
举例:对序列 [5 4 7 9 8 2 6 1 3] 进行快速排序
- 选取第一个数为参考数,并将第一个数存放在临时变量里
- 将比参考数大的放在参考数的右边,比参考数小的放在参考数的左边
- 然后对参考数的左右两侧的数分别进行递归
代码实现
void QuickSort(int* arr,int start,int end){
int i=start;
int j=end;
int tmp=arr[start];//保存参考点
if(i<j){//递归结束条件
while(i<j){//循环调动i和j,完成一轮元素左右调动
//当j处的值比参考数大,j左移
while(i<j&&tmp<=arr[j])
{
j--;
}
//对左移之后的j所对应的值放到左边i处
if(i<j)
{
arr[i]=arr[j];
i++;
}
//当i处的值比参考值小,i右移
while(i<j&&tmp>arr[i])
{
i++;
}
//对右移之后的i所对应的值放到右边j处
if(i<j)
{
arr[j]=arr[i];
j--;
}
}
arr[i]=tmp;//把基准数放到i位置
//对左半部分进行快速排序
QuickSort(arr,start,i-1);
//对右半部分进行快速排序
QuickSort(arr, i + 1, end);
}
}