快速排序2
思路
前面和 快速排序1 的思想大致一样
1. 找一个基准数先将数组分成三部分(小于基准数部分,基准数,大于基准数部分)再进而递归
2. 区别在于for循环部分
3. 设置一个i,将小于基准数p的部分放在arr[l+1,j]中,将大于基准数p的部分放在arr[j+1,r]中
4. 即判断arr[i]与p的关系,如果arr[i]<p,将arr[i]与arr[j+1]的值交换,然后j++
5. 最后将arr[l]与arr[j]交换,完成arr[l,j-1]<p,arr[j]=p,arr[j+1]>p
代码
#include <stdio.h>
void _quick_sort(int arr[],int l,int r){
if(l>=r){
return;
}
int p = arr[l];//设置基准数
int j = l;
// arr[l+1,j]<p; arr[j+1,i]>p
for (int i = l+1; i<=r; i++) {
if(arr[i]<p){// <p 放到arr[l+1,j]中
j++;
//交换
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//其他的不做处理自然进入了arr[j+1,r]这一段数组中
}
//最终结果 arr[l,j-1] < p,arr[j] = p,arr[j+1,r]>p
int temp = arr[l];
arr[l] = arr[j];
arr[j] = temp;
//递归处理左右部分
_quick_sort(arr, l, j-1);
_quick_sort(arr, j+1, r);
}
int quick_sort(int arr[],int n){
_quick_sort(arr,0,n-1);
return 0;
}
int main(int argc, const char * argv[]) {
// insert code here...
int arr[] = {9,2,1,6,5,4,3};
quick_sort(arr, 7);
for (int i = 0; i<7; i++) {
printf("%d\n",arr[i]);
}
return 0;
}