注册 登录
编程论坛 C++教室

老师都不会的数组问题!!各位赶紧来支招啊!

跳跳鱼 发布于 2011-06-02 13:08, 692 次点击
呵呵!激动啊!老师中被俺难住了!话说书上有这样一个题:用选择法对数组中10个整数由小到大排序。下面是程序代码
#include <iostream>
using namespace std;
int main()
{
void select_sort(int a[],int n);
int a[10],i;
cout<<"enter the original array:"<<endl;
for(i=0;i<10;i++)
cin>>a[i];
cout<<endl;
select_sort(a,10);
cout<<"the sorted srray:"<<endl;
for(i=0;i<10;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}
void select_sort(int a[],int n)
{int i,j,k,t;
for(i=0;i<n-1;i++)
{k=i;
for(j=i+1;j<n;j++)
if(a[j]<a[k])k=j;
t=a[k];a[k]=a[i];a[i]=t;
}
}
下面正式开说,注意上面代码的红色字体。个人感觉这个K很鸡肋,明明可以直接比较两个数,为什么还要加个K呢?所以我对形参函数做了一下改变;
void select_sort(int a[],int n)
{int i,j,k;
for(i=0;i<10;i++)
for(j=i+1;j<n;j++)
{if(a[i]>a[j])
t=a[i];a[i]=a[j];a[j]=t;
}
}
问题是,试验了一下,编译什么的都没有错,但一到执行就执行不了了,特别起怪。老师也说不清楚那错了。
为什么那个K不能去掉呢?K的作用是干嘛的呢?求解。。。。。。。。。。
11 回复
#2
Pirelo2011-06-02 13:22
VC6.0,好像没问题哦
只有本站会员才能查看附件,请 登录
#3
hoho5682011-06-02 14:19
哦,看错了,没问题的。。


[ 本帖最后由 hoho568 于 2011-6-2 14:21 编辑 ]
#4
lz10919149992011-06-02 16:26
程序代码:
void sort_asc(int * ar, int size) {        // 升序
    int i, j, k;
    for(i = 0; i < size - 1; i++) {
        k = i;
        for(j = i + 1; j < size; j++) {
            if(ar[j] < ar[k]) {
                k = j;
            }
        }
        if(k != i) {
            swap(ar + k, ar + i);
        }
    }
}

void sort_desc(int * ar, int size) {        // 降序
    int i, j, k;
    for(i = 0; i < size - 1; i++) {
        k = i;
        for(j = i + 1; j < size; j++) {
            if(ar[j] > ar[k]) {
                k = j;
            }
        }
        if(k != i) {
            swap(ar + k, ar + i);
        }
    }
}

void swap(int * p1, int * p2) {
    *p1 ^= *p2;
    *p2 ^= *p1;
    *p1 ^= *p2;
}
我对你的老师很无语。



[ 本帖最后由 lz1091914999 于 2011-6-2 16:29 编辑 ]
#5
跳跳鱼2011-06-02 22:18
同志们!同志们!方向错啦啊!我问的是为啥要有个K呢?K...
明明不加K就可以直接比较的
#6
跳跳鱼2011-06-02 22:29
只有本站会员才能查看附件,请 登录
会出现这种情况啊!
#7
跳跳鱼2011-06-02 22:31
只有本站会员才能查看附件,请 登录
会出现这种情况啊!
#8
诸葛修勤2011-06-03 09:24
代码1:
程序代码:
void select_sort(int a[],int n)
{
    int i,j,k,t;
    for(i=0;i<n-1;i++)
    {
        k=i;
        for(j=i+1;j<n;j++)
            if(a[j]<a[k])
                k=j;
        t=a[k];
        a[k]=a[i];
        a[i]=t;
    }
}
代码2:
程序代码:
void select_sort(int a[],int n)
{
    int i,j,t;
    for(i=0;i<9;i++)
    {
        for(j=i+1;j<n;j++)
        {
            if(a[i]>a[j])
            {
                t=a[i];
                a[i]=a[j];
                a[j]=t;
            }
        }
    }
}
这两段代码都是排序的 但是所用的方法是不一样的  注意看自己题目的要求是要用选择法进行排序。
代码1是选择法
代码2是简单的比较交换(不是冒泡,插入, 选择,快排,希尔,堆排,基数)

代码1中之所以要k是因为选择排序要定位到某个数据(最大或最下)的下标(当然是在没有排序好序的那些当中)

#9
诸葛修勤2011-06-03 09:28
void select_sort(int a[],int n)
{int i,j,k;
for(i=0;i<10;i++)
for(j=i+1;j<n;j++)
{if(a[i]>a[j])
t=a[i];a[i]=a[j];a[j]=t;   这里改的也不对
}
}

截图的情景多半是你数组越界造成的
#10
跳跳鱼2011-06-03 12:22
谢啦谢啦!受教啦!这个。。。。。让我发现我们老师是多么菜菜
#11
lianjiecuowu2011-06-03 15:05
#include <iostream>
using namespace std;
int main()
{
    const int N=10;
    int data[N];
    int temp;
    cout<<"please input 10 numbers:"<<endl;
    for(int i=0;i<N;i++)
    cin>>data[i];
    for(int i=0;i<N-1;i++)
    for(int j=i+1;j<N;j++)
    if((data[i]%2==data[j]%2)&&data[i]>data[j]||data[i]%2<data[j]%2)
    {
        temp=data[i];
        data[i]=data[j];
        data[j]=temp;
        
    }
    for(int i=0;i<N;i++)
    cout<<data[i]<<"\t";
   
    system("pause");
    return 0;
}
#12
爱德华2011-06-05 22:32
我也看了半天才搞清楚,
1