2023/01/06更新
快速排序注意
- 上来先给个
if(i<j)
条件判断,避免子快排的出错(分而治之,递归) while(i<j&&a[i]<=pivot) ++i;
.虽然外层循环条件是i<j
。内层仍然要判断i<j
。避免因为内层前段i
值改变影响后续代码判断。- 设置的基准数
pivot
是最左边的数,所以需要让右边的哨兵j
先出动。(因为算法一直默认选择让做左边索引为low
的数初始化为pivot
。若左哨兵先动,相遇点的元素一定大于pivot
,i=j
时跳出循环,相遇点元素会在pivot
的左边。)
代码
#include<stdio.h>
#include<stdlib.h>
void BubbleSort(int a[],int n){
int i,j,flag;
int temp;
for(i=0;i<n;i++){
flag=0;
for(j=0;j<n-i-1;j++){
if(a[j]>a[j+1]){
temp=a[j+1];
a[j+1]=a[j];
a[j]=temp;
flag=1;
}
}
if(flag==0)
break;
}
}
void QuickSort(int a[],int low,int high){
int pivot;
int i=low,j=high;
if(i<j){
pivot=a[i];
while(i<j){
while(i<j&&a[j]>=pivot) --j;
while(i<j&&a[i]<=pivot) ++i;
if(i<j){
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
else{
a[low]=a[i];
a[i]=pivot;
}
}
QuickSort(a,low,i-1);
QuickSort(a,i+1,high);
}
}
void print(int array[],int n){
int i;
for(i=0;i<n;i++){
printf("%d ",array[i]);
}
}
int main()
{
int array[]={4,3,6,9,7,1,2,4,5,0};
int n=10;
int low=0,high=9;
QuickSort(array,low,high);
print(array,n);
}