C语言中的快速排序
我正在尝试对我的项目使用快速排序,但它不起作用。我不知道bug在哪里。有谁能帮我弄明白吗?多谢各位C语言中的快速排序,c,C,我正在尝试对我的项目使用快速排序,但它不起作用。我不知道bug在哪里。有谁能帮我弄明白吗?多谢各位 void quicksort(int arr[],int a, int b){ if(a<=b){ int key=arr[a]; int index=a; int i=a, j=b; while(i<=j){ for(;arr[j]>key;--j); int
void quicksort(int arr[],int a, int b){
if(a<=b){
int key=arr[a];
int index=a;
int i=a, j=b;
while(i<=j){
for(;arr[j]>key;--j);
int temp=arr[j];
arr[j]=key;
arr[index]=temp;
index=j;
for(;arr[i]<key;++i);
temp=arr[i];
arr[i]=key;
arr[index]=temp;
index=i;
}
quicksort(arr,a,index);
quicksort(arr,index,b);
}
else return;
}
void快速排序(int-arr[],int-a,int-b){
如果(aC)已经带有进行快速排序的功能。为什么
arr[j]=key;
因为你应该在波普尔的位置只放一次枢轴
和呼唤
quicksort(arr,a,index);
quicksort(arr,index,b);
也有气味,因为你有低指数和高指数相同
在谷歌的qucksort上查看这段精彩视频(包括大量代码和解释)
您的内部循环执行以下操作:
- 从数组的右侧进行检查,以查找应位于
键的左侧的元素
- 使用位于
索引的键
交换找到的任何元素,并将索引
更新到键
的新位置
- 从数组的左侧进行检查,以找到应位于
键的右侧的元素
- 使用位于
索引的键
交换找到的任何元素,并将索引
更新到键
的新位置
你到底为什么要这样做?你应该这样做:
- 从数组的右侧进行检查,以查找应位于
键的左侧的元素
- 从数组的左侧进行检查,以找到应位于
键的右侧的元素
- 如果找到,交换它们。如果没有,将枢轴放在正确的位置并退出循环
我不是百分之百确定,但我认为在您的quicksort版本中反复使用键
可能是问题的罪魁祸首。找出问题的最佳方法是一步一步地调试代码,看看哪里出了问题
下面是根据我上述建议的实现,以及一些测试用例:
void swap(int arr[], int i, int j) {
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
void quicksort0(int arr[], int a, int b) {
if (a >= b)
return;
int key = arr[a];
int i = a + 1, j = b;
while (i < j) {
while (i < j && arr[j] >= key)
--j;
while (i < j && arr[i] <= key)
++i;
if (i < j)
swap(arr, i, j);
}
if (arr[a] > arr[i]) {
swap(arr, a, i);
quicksort0(arr, a, i - 1);
quicksort0(arr, i + 1, b);
} else { // there is no left-hand-side
quicksort0(arr, a + 1, b);
}
}
void quicksort(int arr[], int len) {
quicksort0(arr, 0, len - 1);
}
int main() {
int a1[] = { };
int a2[] = { 1 };
int a3[] = { 1, 1 };
int a4[] = { 1, 2, 3, 4, 5 };
int a5[] = { 5, 4, 3, 2, 1 };
int a6[] = { 9, 2, 6, 7, 5, 4, 0, 2, 7, 5 };
quicksort(a1, 0);
quicksort(a2, 1);
quicksort(a3, 2);
quicksort(a4, 5);
quicksort(a5, 5);
quicksort(a6, 10);
quicksort(a6, 10);
}
void swap(int arr[],int i,int j){
内部温度=arr[j];
arr[j]=arr[i];
arr[i]=温度;
}
void quicksort0(int arr[],int a,int b){
如果(a>=b)
返回;
int key=arr[a];
int i=a+1,j=b;
而(i=键)
--j;
而(i 为什么你认为你有一个bug?你的程序崩溃了吗?产生了意想不到的结果吗?或者这样想:如果你把这个问题作为电子邮件发送给你的教授,你真的认为你的教授会倾向于响应吗?如果你使用C++,你应该避免<代码> qSoS> <代码>,而使用<代码> STD::排序< /COD>。代码>排序
将更安全、更易于使用,而且可能更快。qsort
不一定实现快速排序。qsort
的算法未按标准指定:qsort
不应与快速排序混淆。