快速排序
一句话描述:选一个元素,比他小的元素放左面,比他大的放右面,一趟确定一个元素正确位置。通过递归,再分别对左面和右面的元素进行同样操作。
四i三w一A两递归:四爱三打一A两递归
#include <stdio.h>
void quickSort(int A[],int low,int high){
//速记口诀 四个i:一个if,三个int
//当左指针与右指针重合时,当前层排序完成
if(low>=high) return;
//临时变量初始化
int i=low;
int j=high;
int temp=A[i];
//三个w:一外两内循环
//快排精髓:以第一个元素为锚点
while(i<j){
//找j,左移右指针,直至右指针指向元素小于temp,此时不再移动
while(i<j && temp<=A[j]) j--;
//交换,小元素所以往前放,右指针固定
A[i] = A[j];
//找i,此时右移左指针,直至左指针指向元素大于temp,停止移动
while(i<j && temp>=A[i]) i++;
//交换,大元素所以往后放
A[j] = A[i];
//i<j,不断循环,不断交换
}
//循环结束此时i==j,此时实现了左边所有元素比temp小,右边都比temp大,temp位置确定
A[i] = temp;
//一次确定一个元素正确位置,向temp两侧调用快排算法
quickSort(A,low,i-1);
quickSort(A,j+1,high);
}
测试函数:
int main() {
int A[] = {6, 3, 4, 5, 1, 2};
int len = sizeof(A)/sizeof(int);
quickSort(A, 0, len-1);
for(int i=0;i<len;i++){
printf("%d ",a[i]);
}
return 0;
}