Java教程

选择排序算法

本文主要是介绍选择排序算法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
#include <stdio.h>

//最小值 
//选择算法递归实现    
//原理:每次从a[i]~a[n]中选择一个最大值/最小值放到序列首部(得到最值的方法时比较),
//这样当i=n-1时正好求得一个排序序列 
//时间复杂度分析:设原问题时间复杂度位T(n),共分成了1个子问题
//则T(n)=T(n-1)+n    T(n-1):是要选择n-1次,n:是要比较的次数    (因为1,2,3...都被舍去了)
//递推公式自己去算,数学就可以退出来,=O(n^2) 
void Select(int a[],int i,int n)
{
    if(i<n)
    {
        int small,j,temp;
        small=i;    //用每个递归序列的开头元素去比较 
        for(j=i+1;j<n;j++)
            if(a[j]<a[small])
                small=j;       //获得最小值的下标 
        //交换    使每一次递归 得到一个最小值,放在i-n的行首 
        temp=a[small];
        a[small]=a[i];
        a[i]=temp;  
        Select(a,i+1,n);   //进行下一次递归  
    }
}
//选择算法的非递归实现 1   算法原理:相邻元素两两比较 
void Select1(int a[],int n)
{
    int temp;
    for(int i=0;i<n-1;i++)   
        for(int j=i;j<n;j++)
        {
            if(a[i]>a[j])
            {
                temp=a[i];
                a[i]=a[j];
                a[j]=temp;
            }
        }
 } 
//遍历算法 
void Print(int a[],int n)
{
    for(int i=0;i<n;i++)
        printf("%d ",a[i]);
}
int main()
{
    int a[10]={100,32,12,1000,43,56,43,89,0,1};
    int b[10]={100,32,12,1000,43,56,43,89,0,1};
    printf("递归遍历序列: ");
    Select(b,0,10);
    Print(b,10);
    printf("\n左右交换法的序列: ");
    Select1(a,10);
    Print(a,10);
    return 0;
}

 

这篇关于选择排序算法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!