我的代码编译并运行。但是在输入之后它不会执行程序的下一个语句。
它接受数组的所有输入元素然后它不做任何事情。我认为在scanf
循环内的第二个for
语句之后存在问题。
我不确定代码是否正确但是在编译和运行之后,我预计它应该给出最终输出,即使它不是预期的(或不正确的)。
我使用Code::Blocks(16.01)
作为IDE。
我的操作系统是Windows 8.1(64位)。
我的代码:
#include <stdio.h>
void quick(int *, int, int);
int main() {
int n, i, pivot, j, k, l, u;
printf("Give size\n");
scanf("%d", &n);
int a[n];
printf("Enter the list\n");
for (i = 1; i <= n; i++)
scanf("%d", &a[i]);
quick(a, 1, n - 1);
printf("\nSorted numbers are\n");
for (i = 1; i <=n; i++)
printf("%d ", a[i]);
printf("\n");
return 0;
}
void quick(int a[], int l, int u) {
int pivot, j, temp, i;
pivot = a[l];
i = l;
j = u;
while (i <= j) {
if (a[i] > pivot && a[j] < pivot) {
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
else if (a[i] < pivot)
i++;
else if (a[j] > pivot)
j--;
}
quick(a, l, j - 1);
quick(a, j + 1, u);
}
答案 0 :(得分:1)
正如其他人在评论中指出的那样,你犯了一些错误:
int a[n]
;并且数组索引从0开始,那么为什么要传递数组,因为它的索引从1开始?您需要将for循环更改为:for(i=0;i<n;i++)
并快速拨出以下呼叫:quick(a,0,n-1);
。a[l]
作为您的支点,但您可以在分区逻辑中包含它。您还没有检查递归的基本条件,即l < u
。 我希望这会有所帮助。
答案 1 :(得分:0)
纠正你的for循环,从0开始,因为C是0原点。
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
C函数参数始终是“按值传递”,这意味着函数scanf只能看到您指定为参数表达式的当前值的副本。
数组名称返回数组的第一个元素的指针(存储数组的内存位置),标量变量的名称返回标量的值,因此您需要使用&amp; operator用于获取需要写入值的标量的内存位置。
请检查您的快速排序逻辑并致电
答案 2 :(得分:0)
这是您的程序的工作版本,稍作修改:
1)第一个元素被选为pivot
2)检查递归函数的停止条件,即if (lo >= hi) { return; }
3)在i-1
循环
while
处的元素交换pivot元素
4)在else if (a[i] <= pivot)
和else if (a[j] >= pivot)
中包含相等性,以防止元素与pivot具有相同值时的不定式循环,例如1 1 3 5
#include <stdio.h>
void quick(int a[], int lo, int hi)
{
if (lo >= hi)
{
return;
}
int pivot, j, temp, i;
pivot = a[lo];
i = lo + 1;
j = hi;
while (i <= j)
{
if (a[i] > pivot && a[j] < pivot)
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
i++;
j--;
}
else if (a[i] <= pivot)
i++;
else if (a[j] >= pivot)
j--;
}
int l = i - 1;
temp = a[l];
a[l] = a[lo];
a[lo] = temp;
quick(a, lo, l-1);
quick(a, l+1, hi);
}
int main()
{
const int MAX_NUM = 100;
int arr[MAX_NUM];
int n = 0;
printf("How many numbers? n = ");
scanf("%d", &n);
if (n < 1 || n > 100)
{
printf("Invalid input. Nothing to do\n");
return 0;
}
for (int i = 0; i < n; i++)
{
printf("a[%d] = ", i);
scanf("%d", &arr[i]);
}
printf("Sorting...\n");
quick(arr, 0, n-1);
for (int i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
答案 3 :(得分:0)
试试这个,您甚至可以根据自己的选择进行修改:
private void button_Click(object sender, EventArgs e)
{
var button = (Button)sender;
textBox1.Text += button.Tag.ToString();
counter++;
again();
}
public Form1()
{
InitializeComponent();
button1.Tag = 1;
button1.Click += button_Click;
button2.Tag = 2;
button2.Click += button_Click;
// and so on for other buttons
}
答案 4 :(得分:0)
您的代码存在问题:
scanf()
。数组是基于C的0
。循环逻辑应该读取
for (i = 0; i < n; i++) {
...
}
类似地,如果边界包含在函数quick
中,这不是在C中执行操作的经典方法,则函数调用应为:
quick(a, 0, n - 1);
避免命名变量l
,它看起来与1
类似。
函数quick
中的QuickSort算法似乎不正确。以下是一个广泛的参考:http://en.wikipedia.org/wiki/Quicksort
以下是修改后的版本:
#include <stdio.h>
void quick(int *, int, int);
int main(void) {
int n, i;
printf("Give size\n");
if (scanf("%d", &n) != 1)
return 1;
int a[n];
printf("Enter the list\n");
for (i = 0; i < n; i++) {
if (scanf("%d", &a[i]) != 1)
return 1;
}
quick(a, 0, n - 1);
printf("\nSorted numbers are\n");
for (i = 0; i < n; i++)
printf("%d ", a[i]);
printf("\n");
return 0;
}
void quick(int a[], int lo, int hi) {
if (lo < hi) {
int pivot = a[lo];
int i = lo - 1;
int j = hi + 1;
int temp;
for (;;) {
while (a[++i] < pivot)
continue;
while (a[--j] > pivot)
continue;
if (i >= j)
break;
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
quick(a, lo, j);
quick(a, j + 1, hi);
}
}