| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 478 人关注过本帖
标题:求解关于用两个指针排序的问题
只看楼主 加入收藏
黄粱梦
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2015-5-5
结帖率:0
收藏
 问题点数:0 回复次数:7 
求解关于用两个指针排序的问题
导师让我们用两个指针对一维数组排序,要从两端开始比较,小弟编了一下午,还是运行出错,跪求大神帮忙
#include "stdafx.h"

int main(int argc, char* argv[])
{
    int i,k;
    int a,b,c;
    int x[4];
    int *p;

    printf("请输入4个数字:\n");
    for(i=0;i<4;i++)
    {
       scanf("%d",&x[i]);
    }
    p=x;
    for(a=0,b=3;a<2,b>2;a++,b--)
    {
        if(*(p+a)>*(p+b))
        {
            c=*(p+a);
            *(p+a)=*(p+b);
            *(p+b)=c;
        }
    }
   
    for(k=0;k<4;k++)
    {
        printf("%4d",x[k]);
    }
    return 0;
}

程序低级,勿见怪
2015-09-20 16:07
小王KING
Rank: 2
等 级:论坛游民
威 望:1
帖 子:29
专家分:69
注 册:2015-9-9
收藏
得分:0 
#include "stdafx.h"

int main(int argc, char* argv[])
{
    int i,k;
    int a,b,c;
    int x[4];
    int *p;

    printf("请输入4个数字:\n");
    for(i=0;i<4;i++)
    {
       scanf("%d",&x[i]);
    }
    p=x;
    for(a=0,b=3;a<2,b>2;a++,b--)
    {
        if(*(p+a)>*(p+b))                 //请用这种形式p[a],p[b],一定要用*(p+a)这中形式,应该是这样*(p+a*sizeof(int)),因为int类型占两字节,所以指针要移动,一次需要移动两个字节,例如:获得第三个元素的内容应该是*(p+2*sizof(int)),也就是*(p+4);用数组形式就没不需要考虑这个问题,例如,获得第三个元素内容,p[2]就可以了
        {
            c=*(p+a);                           
            *(p+a)=*(p+b);
            *(p+b)=c;
        }
    }
   
    for(k=0;k<4;k++)
    {
        printf("%4d",x[k]);
    }
    return 0;
}
2015-09-20 16:36
黄粱梦
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2015-5-5
收藏
得分:0 
回复 2楼 小王KING
虽然不是很懂,但还是谢谢大神
2015-09-20 16:58
来生再见
Rank: 1
来 自:江西省抚州市
等 级:新手上路
威 望:1
帖 子:39
专家分:9
注 册:2015-9-13
收藏
得分:0 
回复 2楼 小王KING
不用那样啊,谭浩强爷爷的书说的很清楚
int a[4]={1,2,3,4};
int *p=a;
p+1 指针是移动4个字节,不需要p+sizeof(int)*4

重新开始,努力
2015-09-21 21:37
来生再见
Rank: 1
来 自:江西省抚州市
等 级:新手上路
威 望:1
帖 子:39
专家分:9
注 册:2015-9-13
收藏
得分:0 
以下是引用黄粱梦在20/9/2015 16:07:10的发言:

导师让我们用两个指针对一维数组排序,要从两端开始比较,小弟编了一下午,还是运行出错,跪求大神帮忙
#include "stdafx.h"

int main(int argc, char* argv[])
{
    int i,k;
    int a,b,c;
    int x[4];
    int *p;

    printf("请输入4个数字:\n");
    for(i=0;i<4;i++)
    {
       scanf("%d",&x);
    }
    p=x;
    for(a=0,b=3;a<2,b>2;a++,b--)
    {
        if(*(p+a)>*(p+b))
        {
            c=*(p+a);
            *(p+a)=*(p+b);
            *(p+b)=c;
        }
    }
   
    for(k=0;k<4;k++)
    {
        printf("%4d",x[k]);
    }
    return 0;
}

程序低级,勿见怪


可以对一维分成2段A段,B段
再对A,B段升序排列
之后把B段的元素一个个的插入到A段

重新开始,努力
2015-09-21 21:40
来生再见
Rank: 1
来 自:江西省抚州市
等 级:新手上路
威 望:1
帖 子:39
专家分:9
注 册:2015-9-13
收藏
得分:0 
程序代码:

#include <stdio.h>
#define N 4

void sort(int *first,int *end,int position);//使用插入排序
void print_array(int *first,int *end);
int main(void){
            //0 1 2 3 4 5 6 7 8 9
    int b[N]={1,6,2,7};
    int middle=(N-1)/2;
    int *a=b;
    int *c=b+middle+1;
    sort(a,b+middle,0);//对前半段排序
    sort(c,b+N-1,0);//对后半段排序
    sort(a,b+N-1,middle);//整体排序
    print_array(b,b+N-1);
}
//插入排序
/*
position:是位移量
插入排序:就是将后面的元素插入到前面有序的元素序列中去
*/
void sort(int *first,int *end,int position){
    int *p,*p1,*temp=NULL;
    for(p=first+position+1;p<=end;p++){
        temp=p;
        for(p1 = p-1;p1 >= first;p1--){
            if(*temp < *p1){
                int t=*temp;
                *temp=*p1;
                *p1=t;
                temp=p1;
            }
        }
    }
}

void print_array(int *first,int *end){
    int *p;
    for(p=first;p<=end;p++){
        printf(" %d",*p);
    }
}

重新开始,努力
2015-09-21 23:10
小王KING
Rank: 2
等 级:论坛游民
威 望:1
帖 子:29
专家分:69
注 册:2015-9-9
收藏
得分:0 
回复 4楼 来生再见
是我想当然了,看错了,没仔细看
2015-09-21 23:31
来生再见
Rank: 1
来 自:江西省抚州市
等 级:新手上路
威 望:1
帖 子:39
专家分:9
注 册:2015-9-13
收藏
得分:0 
以下是引用小王KING在21/9/2015 23:31:54的发言:

是我想当然了,看错了,没仔细看


重新开始,努力
2015-09-22 00:06
快速回复:求解关于用两个指针排序的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017516 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved