今天在复习排序算法的时候做了快速排序的代码,但是经过编译发现只进行了一次排序,但是我多次检查没有找出自己的错误,不知道自己哪里出现了问题。希望广大的网友能够伸出援助之手。
//快速排序
void QickSort(int nums[N],int left,int right){//只进行了一次排序?
if(left<right){
int temp;
int i=left;
int j=right;
int x=nums[left];//选定第一个数值作为基准
while(i<j){
while(i<j && nums[j]>=x){//找出右边小于基准的数组元素
j--;//指向小于基准的数值
}
while(i<j && nums[i]<=x){//找出左边大于基准的数组元素
i++;//指向大于基准的数值
}
if(i<j){//交换左边大于基准的数值与右边小于基准的数值的位置
temp=nums[j];//存储小于基准的数值
nums[j]=nums[i];
nums[i]=temp;
}
}
//找到基准所在数组的准确位置并且发生交换
nums[left]=nums[i];
nums[i]=x;
QickSort(&nums[N],left,i-1);//左边(小于)基准数组
QickSort(&nums[N],i+1,right); //右边(大于)基准数组
}
}
输入数据:12 18 9 20 13 4
输出结果: 9 12 18 20 13
25行,26行不对,&nums[N]是什么鬼?把那个直接改成nums
#include<stdio.h>
//快速排序
#define N 6
void QickSort(int nums[],int left,int right)
{ //只进行了一次排序?
if(left<right) {
int temp;
int i=left;
int j=right;
int x=nums[left];//选定第一个数值作为基准
while(i<j) {
while(i<j && nums[j]>=x) { //找出右边小于基准的数组元素
j--;//指向小于基准的数值
}
while(i<j && nums[i]<=x) { //找出左边大于基准的数组元素
i++;//指向大于基准的数值
}
if(i<j) { //交换左边大于基准的数值与右边小于基准的数值的位置
temp=nums[j];//存储小于基准的数值
nums[j]=nums[i];
nums[i]=temp;
}
}
//找到基准所在数组的准确位置并且发生交换
nums[left]=nums[i];
nums[i]=x;
QickSort(nums,left,i-1);//左边(小于)基准数组
QickSort(nums,i+1,right); //右边(大于)基准数组
}
}
int main()
{
int t[6]= {12, 18, 9, 20, 13, 4};
QickSort(t,0,N-1);
for(int j=0; j<N; j++)
printf("%d ",t[j]);
return 0;
}