开头:
爱炒股票短线的人,总是喜欢不断地买进卖出,想通过价差来实现盈利。但通常这种频繁操作的人,即使失误不多,也会因为操作的手续费和印花税过高而获利很少。还有一种做股票的人,他们很少出手,只是在不断的观察和判断,等到时机一到,果断买进或卖出。它们因为冷静和沉着,以及交易的次数少,而最终收益颇丰。
我们可不可以像只有在时机非常明确到来时才出手的股票高手一样,也就是在排序时找到合适的关键字再做交换,并且只移动一次就完成相应关键字的排序定位工作呢?
这就是选择排序的初步思想。
选择排序是直观的排序,通过一个中间量从带排序的的数中找出最大或最小的交换到对应位置。再选择次之。选择排序和冒泡排序一样,都有两层循环。
简单来说就是:
①将数组每次循环序列的头元素下标预设为最小值变量(min)
②头元素之后的剩余的元素依次与最小值变量所属位置的关键字相比较,若比其小,则用其下标取代最小值变量中的下标
③内层循环结束后将最小值元素位置与首元素位置进行交换
④重复上述过程,外层循环每循环一次,内层循环每循环一轮,都会筛选出每个子序列对应的最小值,在进行交换操作。
代码如下:
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 10 /* 用于要排序数组个数最大值, 可根据需要修改*/
#define TRUE 1
#define FALSE -1
typedef int Status;
typedef struct
{
int r[MAXSIZE+1];/* 用于存储要排序数组,r[0]用作哨兵或临时变量 */
int length;/* 用于记录顺序表的长度 */
}SqList;
/*交换L中数组r的下标为i和j的值*/
void swap(SqList *L, int i, int j)
{
int temp = L->r[i];
L->r[i] = L->r[j];
L->r[j] = temp;
}
void Select_sort(SqList *L)
{
int i, j, min;
for(i=1; i<L->length; i++)
{ min = i;
for(j=i+1;j<=L->length;j++)
{
if(L->r[min]>L->r[j])
min = j;
}
if(min != i)
swap(L, i, min);
}
}
/*对顺序表L作简单选择排序*/
void main()
{
SqList *list = (SqList*)malloc(sizeof(SqList));
list->length = 10;
int a[MAXSIZE] = {1,3,2,0,5,7,9,22,-1,4};
for(int i=0; i<MAXSIZE; i++)
{
list->r[i+1] = a[i];
}
Select_sort(list);
for(int j=1; j<=MAXSIZE; j++)
printf("%d\n", list->r[j]);
}