- 算法思想:
选择排序有简单的选择排序和二元选择排序。其中,简单选择排序是依次寻找序列中的最小值,然后将其放入序列的前端。比如,序列 a[16]={88,10,71,29,50,9,34,4,675,3,89,19,55,67,45,234};第一次循环找到最小值3,然后与第一个元素交换;接下来,在除去第一个元素后的序列中寻找最小值,并与原序列中的第二个元素交换;直到第n个元素与第n-1个元素交换完成,则排序结束。而二元选择排序则是每次循环确定最大值和最小值,将最大值向序列尾部放,将最小值向序列首部放,这样循环n/2次就足够。 - C++程序(VS2012)
//打印排序结果函数
void Print(int a[],int n,int i=0)
{
//cout<<i<<endl;
cout<<"排序后的结果为:"<<endl;
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
}
简单选择排序:
//简单选择排序---每次循环确定一个元素
int FindMin(int a[],int n) //查找数组中最小值
{
int minA=a[0];
for(int i=1;i<n;i++)
{
if(a[i]<=minA){ minA=a[i]; }
}
return minA;
}
int minIndex(int a[],int n,int minA) //确定最小值出现位置
{
int Index;
for(int i=0;i<n;i++)
{
if(a[i]==minA)
{
Index=i;
break;
}
}
return Index;
}
void SimpleSelectSort(int a[],int b[],int n)
{
int index;
for(int i=0;i<n;i++)
{
b[i]=FindMin(a,n);
index=minIndex(a,n,b[i]);
a[index]=100000;
}
Print(b,n);
}
二元选择排序:
//二元选择排序---每次循环确定两个元素
void ErYuanSelectSort(int a[],int n)
{
int maxIndex; //maxIndex为数组中最大值索引值
int minIndex; //minIndex为数组中最小值索引值
int temp,i,j; //temp作为两数交换时的中间值,i、j为循环变量
for(i=0;i<n/2;i++) //作不超过n/2次循环
{
minIndex=i; //将最小值索引赋为每次判断序列的首位置i,
maxIndex=n-i-1; //将最大值索引赋为每次判断序列的末位置n-i-1.
if(a[maxIndex]<=a[minIndex]) //因为每次判断最大值和最小值,是在[i+1,n-i-1]之间判断,
{ //并不包括两个端点值,所以在每次判断之前,
temp=a[maxIndex]; //应首先比较两者大小,若初始设定的最大值小于最小值,则交换
a[maxIndex]=a[minIndex]; //等会会有反例证明此步骤的必要性
a[minIndex]=temp;
}
for(j=i;j<n-i;j++) //寻找[i+1,n-i-1]之间的最大值和最小值索引
{
if(a[maxIndex]<=a[j])
maxIndex=j;
if(a[minIndex]>=a[j])
minIndex=j;
}
//交换,即将最大值往后放,最小值往前放
temp=a[i];a[i]=a[minIndex];a[minIndex]=temp;
temp=a[n-i-1];a[n-i-1]=a[maxIndex];a[maxIndex]=temp;
Print(a,n); //在循环内调用数据打印函数,打印每次排序结果
}
Print(a,n); //调用数据打印函数,打印排序结果
}
3 Python程序(Python 2.7)
'''输出排序结果函数'''
def Print(ddata):
n=len(ddata)
for i in range(n):
print ddata[i], #其中","为了不让其输出默认的换行符
简单选择排序:
'''简单选择排序'''
def findMin(data): #寻找最小值和其索引
global k
n=len(data)
minData=data[0]
for i in range(n):
if(data[i]<=minData):
minData=data[i]
k=i
return minData,k
def simSelectSort(data):
n=len(data)
b=[]
for i in range(n):
minData,minIndex=findMin(data)
b.append(data[minIndex])
data[minIndex]=inf
Print(b)
二元选择排序:
'''二元选择排序'''
def findMax(data):
n=len(data)
maxData=data[0]
maxIndex=0
for i in range(n):
if maxData<=data[i]:
maxData=data[i]
maxIndex=i
return maxData,maxIndex
def ErYuanSelectSort(data):
n=len(data)
for i in range(n/2):
minIndex=i;maxIndex=n-i-1
if(data[minIndex]>data[maxIndex]):
data[minIndex],data[maxIndex]=data[maxIndex],data[minIndex]
for j in range(i,n-i):
if data[minIndex]>=data[j]:
minIndex=j
if data[maxIndex]<=data[j]:
maxIndex=j
data[i],data[minIndex]=data[minIndex],data[i]
data[n-i-1],data[maxIndex]=data[maxIndex],data[n-i-1]
print ' '
Print(data)