鱼C论坛

 找回密码
 立即注册
查看: 4267|回复: 7

[技术交流] 选择排序selection sort

[复制链接]
发表于 2011-5-15 16:43:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
     选择排序是基本排序思想的一种,简单点说是:第 i 次排序从序列的后n - i + 1个元素中选择一个最小的元素,与该
n - i + 1个元素的最前面那个元素进行位置交换。
    直观来说就是:每次的排序都是从未排好的序列中选择一个最小的元素,与未排序的元素的第一个进行交换。
    用图来解释下:
                                  3           6              4               2                   11                 10        进行排序
    第一次
由于整个序列都是未排序的 所以,
            选出最小的元素      “2”         6               4              3                   11                   10
      第二次 在后续的为排序的元素
          中选出最小的元素      “2           3”              4             6                   11                   10        
同理进行若干次,直到最后结果
                                “2           3                4             6                   11                   10 ”

   对于选择排序来说,包含 n 个元素的数据序列  需要 n - 1 次的排序   

这就是基本的原理啦。
#include "stdio.h"
#include "malloc.h"
#include "stdlib.h"

int *init_S_Sort(int size)
{
        return (int *)malloc(sizeof(int) * size);
}

void selection_sort(int *size, int length)
{
        int min, loop, loop_in, temp;
        for(loop = 0; loop < length; loop++)
        {
                min = loop;
                for(loop_in = loop + 1; loop_in < length; loop_in ++ )
                {
                        if(size[min] > size[loop_in])
                                min = loop_in;
                }
                temp = size[loop];
                size[loop] = size[min];
                size[min] = temp;
        }
}

int main(void)
{
        int len, len_buf, len_print, *arrary, *arrary_buf, *arrary_print;
        printf("The Length of Arrary:");
        scanf("%d",&len);
        len_print = len_buf = len;
        arrary = arrary_buf = arrary_print =init_S_Sort( len );
        printf("The Elemments Of Arrary:");
        while( len-- )
        {
                scanf("%d",arrary++);
        }
        selection_sort(arrary_buf, len_buf);
        while( len_print --)
        {
                printf("%d ",*arrary_print++);
        }
        return 0;
}
在VC6.0下测试通过,代码实现了预期的功能,但细节处理的还是不够好,主函数过于繁琐,希望大家给出改正建议,多交流。           
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-5-22 16:45:34 | 显示全部楼层
LZ,既然写了
int *init_S_Sort(int size);动态分配了空间,就应该相应有个
void destroy_S_Sort(int*);函数释放动态空间。
LZ的程序内存泄漏。

void selection_sort(int *size
这个参数名字叫size?是在误导使用者?
主函数中*arrary, *arrary_buf, *arrary_print;
这3个只要使用1个就可以了,因为值传递的关系,selection_sort函数不会改变实参的值

同理int len, len_buf, len_print这3个变量只要使用1个就可以了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-5-22 21:03:23 | 显示全部楼层
回复 仰望天上的光 的帖子

关于你提到的变量只需要一个,我解释下,我写的时候,因为用的是指针的操作来进行输入的,也就是输入后,指针不再指向头位置,所以定义了多个。

至于定义一个的操作,只需要将录入的形式更改为,数组下标的形式就好。

关于内存泄漏的问题,这是我没有想到的。我会再之后的程序中加以注意。

同时请教一个问题,我动态的开辟出一个空间,和定义一个足够大空间的数组。为什么前者会造成内存的泄露。


最后是关于参数的问题,谢谢提醒。我会注意的。


问题多交流,总之很感谢你提出的问题。谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-5-22 22:48:41 | 显示全部楼层
关于你提到的变量只需要一个,我解释下,我写的时候,因为用的是指针的操作来进行输入的,也就是输入后,指针不再指向头位置,所以定义了多个。

呵呵,不好意思,看太快没注意到。

同时请教一个问题,我动态的开辟出一个空间,和定义一个足够大空间的数组。为什么前者会造成内存的泄露。

前者空间是在堆上分配的,malloc的空间数量可以是变量,也就是说具体分配多少空间在编译时刻编译器不知道,所以用这种方式内存管理(分配和释放)都要程序员自己做。
后者空间是在堆栈(局部数组)或静态数据区(全局数组)分配的,按照C90标准,数组在编译时期必须知道数组空间的大小,即十足大小不能是变量。这样做的坏出是不灵活,好处是内存管理(内存的分配和释放)不需要程序员来处理。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-5-22 23:08:42 | 显示全部楼层
我按照基于对象的方式也写个版本
#include "stdio.h"
#include "malloc.h"
#include "stdlib.h"
//数据
static int* pData;
static int length;
//接口函数
void Init(int size);
void Destroy();
void InPut();
void OutPut();
void SelectionSort();
//私有函数
static void swap(int index_a, int index_b);

//main
int main(void){
        int len;
        printf("The Length of Arrary:");
        scanf("%d",&len);
        Init(len);
        InPut();
        SelectionSort();
        OutPut();
        Destroy();
        return 0;
}

void Init(int size){
        pData = (int*)malloc(sizeof(int) * (length=size));
}

void Destroy(){
        free(pData);
}

void SelectionSort(){
        int min, loop, loop_in, temp;
        for(loop = 0,min =loop; loop < length; ++loop){
                for(loop_in = loop + 1; loop_in < length; ++loop_in  ){
                        if(pData[min] > pData[loop_in]) min = loop_in;
                }
                swap(loop,min);
        }
}

void swap(int index_a, int index_b){
        int temp;
        temp = pData[index_a];
        pData[index_a] = pData[index_b];
        pData[index_b] = temp;
}

void OutPut(){
        int i;
        for(i=0;i<length;++i) printf("%d\n",pData[i]);
}

void InPut(){
        int i;
        for(i=0;i<length;++i) scanf("%d",pData+i);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-5-23 21:38:57 | 显示全部楼层
回复 仰望天上的光 的帖子

回答一下我提出的问题 谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-5-23 23:14:24 | 显示全部楼层
回复 LNH_Sniper 的帖子

4#不是回复了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-4-1 11:34:26 | 显示全部楼层
回答一下我提出的问题 谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-4 16:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表