使用指针对二维数组中一行中的元素进行排序
Sorting elements in a row in a 2 dimensional array using pointers
我正在尝试对一行二维数组进行排序。但是我做不到。
例如:
7 6 5
5 7 6
8 2 9
2 3 4
变成这样:
5 6 7
5 6 7
2 8 9
2 3 4
下面是我的代码:
void sort(int *a,int num){
int i,j,temp;
for(i=0;i<num-1;i++){
for (j=0;j<num-i-1;j++){
if (*((a+i*3)+j)>*((a+i*3)+j+1)){
temp=*((a+i*3)+j);
*((a+i*3)+j)=*((a+i*3)+j+1);
*((a+i*3)+j+1)=temp;
}
}
}
for(i=0;i<num;i++){
for(j=0;j<3;j++)
printf("%d ",*((a+i*3)+j));
printf("\n");
}
}
以上代码的输出:
6 5 5
7 6 7
2 8 9
2 3 4
谁能告诉我代码中有什么问题?
提前致谢。 :D
编辑:
那么上面的代码应该是这样的吗?
void sort(int *a,int num){
int i,j,temp;
for(i=0;i<num-1;i++){
for (j=0;j<num-i-1;j++){
if (*(*(a+i)+j)>*(*(a+i)+j+1)){
temp=*(*(a+i)+j);
*(*(a+i)+j)=*(*(a+i)+j+1);
*(*(a+m)+j+1)=temp;
}
}
}
}
代码太复杂,所以你在里面犯了很多小错误。
您应该以某种方式对每一行进行单独排序,如下所示:
for (row = 0; row < num; row++) {
sort_row(a + row * 3);
}
函数 sort_row
只对一行进行排序,因此编写和测试起来会更容易(顺便说一句,我用 row
替换了不起眼的名称 i
)。
函数sort_row
应该进行正常的冒泡排序。您甚至可以改用标准库 qsort
(出于测试目的)。
请注意,标准冒泡排序算法是通过两个嵌套循环实现的。如果你想在没有单独的 sort_row
函数调用的情况下实现你的代码,你将需要 三个 嵌套循环。
主要有两个问题:
1) 循环不是 运行n 次,因此 for 循环中的条件应更改为 i < num
而不是跳过最后一行的 i < num - 1
2) 从您的代码来看,您似乎想使用冒泡排序技术。排序是 O(n^2),这就是为什么需要将 if 语句交换为每个元素的 运行 (n - 1) 次,因此您应该在 j-for 循环中再包含一个 for 循环。
我正在尝试对一行二维数组进行排序。但是我做不到。
例如:
7 6 5
5 7 6
8 2 9
2 3 4
变成这样:
5 6 7
5 6 7
2 8 9
2 3 4
下面是我的代码:
void sort(int *a,int num){
int i,j,temp;
for(i=0;i<num-1;i++){
for (j=0;j<num-i-1;j++){
if (*((a+i*3)+j)>*((a+i*3)+j+1)){
temp=*((a+i*3)+j);
*((a+i*3)+j)=*((a+i*3)+j+1);
*((a+i*3)+j+1)=temp;
}
}
}
for(i=0;i<num;i++){
for(j=0;j<3;j++)
printf("%d ",*((a+i*3)+j));
printf("\n");
}
}
以上代码的输出:
6 5 5
7 6 7
2 8 9
2 3 4
谁能告诉我代码中有什么问题? 提前致谢。 :D
编辑: 那么上面的代码应该是这样的吗?
void sort(int *a,int num){
int i,j,temp;
for(i=0;i<num-1;i++){
for (j=0;j<num-i-1;j++){
if (*(*(a+i)+j)>*(*(a+i)+j+1)){
temp=*(*(a+i)+j);
*(*(a+i)+j)=*(*(a+i)+j+1);
*(*(a+m)+j+1)=temp;
}
}
}
}
代码太复杂,所以你在里面犯了很多小错误。
您应该以某种方式对每一行进行单独排序,如下所示:
for (row = 0; row < num; row++) {
sort_row(a + row * 3);
}
函数 sort_row
只对一行进行排序,因此编写和测试起来会更容易(顺便说一句,我用 row
替换了不起眼的名称 i
)。
函数sort_row
应该进行正常的冒泡排序。您甚至可以改用标准库 qsort
(出于测试目的)。
请注意,标准冒泡排序算法是通过两个嵌套循环实现的。如果你想在没有单独的 sort_row
函数调用的情况下实现你的代码,你将需要 三个 嵌套循环。
主要有两个问题:
1) 循环不是 运行n 次,因此 for 循环中的条件应更改为 i < num
而不是跳过最后一行的 i < num - 1
2) 从您的代码来看,您似乎想使用冒泡排序技术。排序是 O(n^2),这就是为什么需要将 if 语句交换为每个元素的 运行 (n - 1) 次,因此您应该在 j-for 循环中再包含一个 for 循环。