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

来源:互联网 发布:linux打包多个文件夹 编辑:程序博客网 时间:2024/06/06 11:35
  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,kdef 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,maxIndexdef 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)
0 0
原创粉丝点击