选择排序selection sort
选择排序是基本排序思想的一种,简单点说是:第 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 > size)
min = loop_in;
}
temp = size;
size = size;
size = 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下测试通过,代码实现了预期的功能,但细节处理的还是不够好,主函数过于繁琐,希望大家给出改正建议,多交流。 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个就可以了。 回复 仰望天上的光 的帖子
关于你提到的变量只需要一个,我解释下,我写的时候,因为用的是指针的操作来进行输入的,也就是输入后,指针不再指向头位置,所以定义了多个。
至于定义一个的操作,只需要将录入的形式更改为,数组下标的形式就好。
关于内存泄漏的问题,这是我没有想到的。我会再之后的程序中加以注意。
同时请教一个问题,我动态的开辟出一个空间,和定义一个足够大空间的数组。为什么前者会造成内存的泄露。
最后是关于参数的问题,谢谢提醒。我会注意的。
问题多交流,总之很感谢你提出的问题。谢谢 关于你提到的变量只需要一个,我解释下,我写的时候,因为用的是指针的操作来进行输入的,也就是输入后,指针不再指向头位置,所以定义了多个。
呵呵,不好意思,看太快没注意到。
同时请教一个问题,我动态的开辟出一个空间,和定义一个足够大空间的数组。为什么前者会造成内存的泄露。
前者空间是在堆上分配的,malloc的空间数量可以是变量,也就是说具体分配多少空间在编译时刻编译器不知道,所以用这种方式内存管理(分配和释放)都要程序员自己做。
后者空间是在堆栈(局部数组)或静态数据区(全局数组)分配的,按照C90标准,数组在编译时期必须知道数组空间的大小,即十足大小不能是变量。这样做的坏出是不灵活,好处是内存管理(内存的分配和释放)不需要程序员来处理。 我按照基于对象的方式也写个版本#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 > pData) min = loop_in;
}
swap(loop,min);
}
}
void swap(int index_a, int index_b){
int temp;
temp = pData;
pData = pData;
pData = temp;
}
void OutPut(){
int i;
for(i=0;i<length;++i) printf("%d\n",pData);
}
void InPut(){
int i;
for(i=0;i<length;++i) scanf("%d",pData+i);
} 回复 仰望天上的光 的帖子
回答一下我提出的问题 谢谢 回复 LNH_Sniper 的帖子
4#不是回复了? 回答一下我提出的问题 谢谢
页:
[1]