| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1308 人关注过本帖
标题:用二维数组对每行的快速排序
只看楼主 加入收藏
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:0 
#include <stdio.h>
#include <stdlib.h>
void* quickSort(void * p, size_t width,
        int (* cmp)(void*, void*), void (* swap)(void*, void*),
        int start, int end);
//----------------------------------------------------------------
int myCmp(int (*a) [2], int (*b) [2]);
void mySwap(int (*a) [2], int (*b) [2]);
void showMyArray(int (*a) [2], int n);
//------------------------------------------------------------------------------

int main(int argc, char* argv[])
{
    int a[5][2] = {{4,1},{6,8},{3,2},{1,5},{10,3}};
    quickSort(a, sizeof(int [2]), (void*)myCmp, (void*)mySwap, 0, 4);
    showMyArray(a, 5);
    return 0;
}

//------------------------------------------------------------------------------
// Function //
//----------//
void* quickSort(void * p, size_t width,
        int (* cmp)(void*, void*), void (* swap)(void*, void*),
        int start, int end)
{
    if (start >= end)
        return p;
    int i = start, j = end - 1;
   
    do {
        while (cmp(p+i*width, p+end*width) < 0) ++i;
        while (cmp(p+j*width, p+end*width) >= 0 && j >= start) --j;
        if (i < j) swap(p+i*width, p+j*width);
        else if (i ^ end) swap(p+i*width, p+end*width);
      
    } while (i < j);
   
    quickSort(p, width, cmp, swap, start, i - 1);
    quickSort(p, width, cmp, swap, i + 1, end);
    return p;
}

int myCmp(int (*a) [2], int (*b) [2])
{
    if (a[0][0] < b[0][0])
        return -1;
    else if (a[0][0] > b[0][0])
        return 1;
    return 0;
}
void mySwap(int (*a) [2], int (*b) [2])
{
    int temp = a[0][0];
    a[0][0] = b[0][0];
    b[0][0] = temp;
}

void showMyArray(int (*a) [2], int n)
{
    int i = 0;
    while (i < n)
    {
        printf("%d %d\n", a[i][0], a[i][1]);
        ++i;
    }
}

—>〉Sun〈<—
2009-10-29 00:02
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:20 
void mySwap(int (*a) [2], int (*b) [2])   //我只对第一列排了序。
{
    int temp = a[0][0];
    a[0][0] = b[0][0];
    b[0][0] = temp;
}


void mySwap(int (*a) [2], int (*b) [2])   // 根据第一列进行排序
{
    int temp = a[0][0];
    a[0][0] = b[0][0];
    b[0][0] = temp;

    temp = a[0][1];
    a[0][1] = b[0][1];
    b[0][1] = temp;
}

//-------------------------------------------------------
如果只比较第一列的话程序不需要自己写排序函数,而且只需要比较函数就可以了

用库函数就qsort可以了
    void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *));

int mycmp(int (*a) [2], int (*b) [2])   // 继续用这个吧
{
    if (a[0][0] < b[0][0])
        return -1;
    else if (a[0][0] > b[0][0])
        return 1;
    return 0;
}






[ 本帖最后由 cosdos 于 2009-10-29 00:16 编辑 ]

—>〉Sun〈<—
2009-10-29 00:14
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:0 
// 如上所说

#include <stdio.h>
#include <stdlib.h>

int myCmp(int (*a) [2], int (*b) [2]);
void showMyArray(int (*a) [2], int n);

int main(int argc, char* argv[])
{
    int a[5][2] = {{4,1},{6,8},{3,2},{1,5},{10,3}};
    qsort(a, 5, sizeof(int [2]), (void*)myCmp);
    showMyArray(a, 5);
    return 0;
}

//------------------------------------------------------------------------------
// Function //
//----------//
int myCmp(int (*a) [2], int (*b) [2])
{
    if (a[0][0] < b[0][0])
        return -1;
    else if (a[0][0] > b[0][0])
        return 1;
    return 0;
}

void showMyArray(int (*a) [2], int n)
{
    int i = 0;
    while (i < n)
    {
        printf("%d %d\n", a[i][0], a[i][1]);
        ++i;
    }
}

—>〉Sun〈<—
2009-10-29 00:21
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:0 
我也因该把 start 和 end 两个参数去掉。

—>〉Sun〈<—
2009-10-29 00:25
快速回复:用二维数组对每行的快速排序
数据加载中...
 
   



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

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