冒泡排序忽略数组的第一个元素
Bubble sort ignoring the first element of the array
我正在做作业,但不知道为什么冒泡排序不起作用。由于某些未知原因,它使数组的第一个元素为零。
#include <iostream>
using namespace std;
int main()
{
int *arr,s;
cout<<"Enter the quantity of numbers ";
cin>>s;
arr=new int[s];
for(int i=0;i<s;i++)
{
cout<<"Enter number "<<i+1<<" ";
cin>>*(arr+i);
}
int temp;
for(int j=0;j<s;j++)
{
for(int k=0;k<(s-j);k++)
{
if(*(arr+k)>*(arr+k+1))
{
temp=*(arr+k);
*(arr+k)=*(arr+k+1);
*(arr+k+1)=temp;
}
}
}
for(int x=0;x<s;x++)
{
cout<<*(arr+x)<<"\t";
}
cout<<endl;
return 0;
}
输出
Enter the quantity of numbers 5
Enter number 1 4
Enter number 2 33
Enter number 3 22
Enter number 4 1
Enter number 5 3
0 1 3 4 22
我不知道为什么第一个元素会变成零。如果我 运行 它没有冒泡排序循环它 运行 完美但没有那些循环。
在这个for循环中
for(int k=0;k<(s-j);k++)
{
if(*(arr+k)>*(arr+k+1))
^^^^^^^
{
temp=*(arr+k);
*(arr+k)=*(arr+k+1);
*(arr+k+1)=temp;
}
当 j
等于 0
并且 k
等于 s - 1
时,尝试访问数组之外的内存。也就是说在这种情况下 k + 1
等于 s
尽管索引的有效范围是 [0, s-1]
.
至少按以下方式更改循环
for(int j=0;j<s;j++)
{
for(int k = 1;k<(s-j);k++)
{
if(*(arr+k) < *(arr+k-1))
{
int temp=*(arr+k);
*(arr+k)=*(arr+k-1);
*(arr+k-1)=temp;
}
}
}
您已停止使用索引。您正在从有效范围之外获取垃圾值(它们恰好为零)。更简单的样式可能有助于检测问题。
for(int j=0;j<s;j++)
{
for(int k=1;k<s;k++)
{
if(arr[k-1]>arr[k])
{
int temp=arr[k];
arr[k]=arr[k-1];
arr[k-1]=temp;
}
代码
#include <bits/stdc++.h>
using namespace std;
int N, a[10050];
int main() {
scanf("%d", &N);
for (int i = 0; i < N; i++) scanf("%d" , &a[i]);
for (int k = 0; k < N; k++) {
int mn = k;
for (int i = k+1; i < N; ++i) {
if (a[i] < a[mn]) mn = i;
}
swap(a[k], a[mn]);
}
for (int i = 0; i < N; i++) printf("%d " , a[i]);
}
说明
在冒泡排序中,您递归地交换元素。这是一个 15 行代码。希望对你有帮助。
我正在做作业,但不知道为什么冒泡排序不起作用。由于某些未知原因,它使数组的第一个元素为零。
#include <iostream>
using namespace std;
int main()
{
int *arr,s;
cout<<"Enter the quantity of numbers ";
cin>>s;
arr=new int[s];
for(int i=0;i<s;i++)
{
cout<<"Enter number "<<i+1<<" ";
cin>>*(arr+i);
}
int temp;
for(int j=0;j<s;j++)
{
for(int k=0;k<(s-j);k++)
{
if(*(arr+k)>*(arr+k+1))
{
temp=*(arr+k);
*(arr+k)=*(arr+k+1);
*(arr+k+1)=temp;
}
}
}
for(int x=0;x<s;x++)
{
cout<<*(arr+x)<<"\t";
}
cout<<endl;
return 0;
}
输出
Enter the quantity of numbers 5
Enter number 1 4
Enter number 2 33
Enter number 3 22
Enter number 4 1
Enter number 5 3
0 1 3 4 22
我不知道为什么第一个元素会变成零。如果我 运行 它没有冒泡排序循环它 运行 完美但没有那些循环。
在这个for循环中
for(int k=0;k<(s-j);k++)
{
if(*(arr+k)>*(arr+k+1))
^^^^^^^
{
temp=*(arr+k);
*(arr+k)=*(arr+k+1);
*(arr+k+1)=temp;
}
当 j
等于 0
并且 k
等于 s - 1
时,尝试访问数组之外的内存。也就是说在这种情况下 k + 1
等于 s
尽管索引的有效范围是 [0, s-1]
.
至少按以下方式更改循环
for(int j=0;j<s;j++)
{
for(int k = 1;k<(s-j);k++)
{
if(*(arr+k) < *(arr+k-1))
{
int temp=*(arr+k);
*(arr+k)=*(arr+k-1);
*(arr+k-1)=temp;
}
}
}
您已停止使用索引。您正在从有效范围之外获取垃圾值(它们恰好为零)。更简单的样式可能有助于检测问题。
for(int j=0;j<s;j++)
{
for(int k=1;k<s;k++)
{
if(arr[k-1]>arr[k])
{
int temp=arr[k];
arr[k]=arr[k-1];
arr[k-1]=temp;
}
代码
#include <bits/stdc++.h>
using namespace std;
int N, a[10050];
int main() {
scanf("%d", &N);
for (int i = 0; i < N; i++) scanf("%d" , &a[i]);
for (int k = 0; k < N; k++) {
int mn = k;
for (int i = k+1; i < N; ++i) {
if (a[i] < a[mn]) mn = i;
}
swap(a[k], a[mn]);
}
for (int i = 0; i < N; i++) printf("%d " , a[i]);
}
说明
在冒泡排序中,您递归地交换元素。这是一个 15 行代码。希望对你有帮助。