排序算法的C++ && Python实现---选择排序

  1. 算法思想:
    选择排序有简单的选择排序和二元选择排序。其中,简单选择排序是依次寻找序列中的最小值,然后将其放入序列的前端。比如,序列 a[16]={88,10,71,29,50,9,34,4,675,3,89,19,55,67,45,234};第一次循环找到最小值3,然后与第一个元素交换;接下来,在除去第一个元素后的序列中寻找最小值,并与原序列中的第二个元素交换;直到第n个元素与第n-1个元素交换完成,则排序结束。而二元选择排序则是每次循环确定最大值和最小值,将最大值向序列尾部放,将最小值向序列首部放,这样循环n/2次就足够。
  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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值