开始学数据结构——(一):选择排序

来源:互联网 发布:戴尔显卡切换软件 编辑:程序博客网 时间:2024/06/06 15:35
/*选择排序 第一步 : 遍历找到最小的数,和第一个数交换位置;
            然后从第二个数开始找,直到找到最小的数和第二个交换位置;
SQ——2014 04 14
*/
#include<stdio.h>
void swap(int * aa , int * bb);
void select(int cc[] ,int n);


int main()

{
  int aa =10;
  int  bb= 5;   
    printf("aa=%d bb= %d" ,aa,bb);
    swap(&aa ,&bb);   //测试两个数值的交换;
    printf("aa=%d bb= %d" ,aa,bb);
//--------------test _2!--------------------
    int cc[10] ={10,8,9,7,6,4,5,3,2,1};
    int i;
    for (i =0; i< (sizeof(cc)/sizeof(cc[0])); i++)    
        printf("  %d \n" ,cc[i]);
    select(cc ,10);     //测试整个数组的排序;
    printf("after select!");
     for (i =0; i< (sizeof(cc)/sizeof(cc[0])); i++)  
             printf(" %d \n" ,cc[i]);
return 0;
}

void select( int a[]  ,int n){
    int i,j,key;
    int  t;
    for (i=0;i < n ; i++) {
        key = a[i];  //保存每次遍历需要替换的值。
        t =i;
        for(j = i +1 ; j < n ;j++) {
            if (key > a[j])  {key =a[j]; //至此,key保存的就是最小的元素,然后交换即可。
                      t =j;
                    }    //有个问题,key是最小值不错,但是如何确定最小值的位置?
                         //所以用t来保存每次最小值的位置。
            }
        if( t != i) //若本来就算最小的,那么就不要替换了。
        swap(&a[i] , &a[t]);
        }
}

void swap(int * aa , int * bb){
    //传递过来的是指针,所以你对指针进行改动是没有意义的。
    int tmp;
    tmp = *aa;
    *aa = *bb;
    *bb = tmp;

}


顺便说下时间复杂度 : 最外层循环为 n ;然后里面每次都需要m ,则为O(n2);

空间 的话只需要一个空间用来交换位置;

稳定的话:不稳定 (比如序列【5, 5, 3】第一趟就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)

0 0
原创粉丝点击