选择排序

来源:互联网 发布:张国荣但愿人长久知乎 编辑:程序博客网 时间:2024/06/07 12:11

简单选择排序与二元选择排序

简单选择排序:通过n-i次关键字间的比较,从n-i-1个记录中选出关键字最小的记录,并和第i个记录进行交换。

实现算法:

#include <stdio.h>#include <stdlib.h>//输出每次排序结果void sout(int num[] ,int n ,int i){    printf(" %d : ",i);    int j ;    for (j=0 ; j<n ; j++)        printf("%d ",num[j]);    printf("\n");}//简单选择排序void selectSort(int num[],int n){    int i,j;    for (i=0 ; i<n-1 ;i++)    {        for (j=i+1; j<n ;j++)        {            if (num[i]>num[j])            {                int tmp = num[i];                num[i] = num[j];                num[j] = tmp;            }        }        sout(num,n,i);    }}int main(void){    int a[9] = {9,5,8,7,4,6,3,2,1};    int i;    //time(a,8);   //shellSort2(a,9);   selectSort(a,9);    for (i=0 ; i<9 ; i++)    {        printf("%d ",a[i]);    }    return 0;}

其复杂度为O(n^2)


二元选择排序:

#include <stdio.h>#include <stdlib.h>//输出每次排序结果void sout(int num[] ,int n ,int i){    printf(" %d : ",i);    int j ;    for (j=0 ; j<n ; j++)        printf("%d ",num[j]);    printf("\n");}//二元选择排序void selectSort(int num[],int n){    int max,min,i,j;    for (i=0 ; i<n/2 ;i++)    {        max = i;        min = i;        for (j=i+1; j<n-i ;j++)        {            if (num[j]<num[min])            {                min = j;                continue;            }            if (num[j]>num[max])            {                max = j;            }        }        int temp = num[min];        num[min] = num[i];        num[i] = temp ;        //如果一次遍历最大数角标正好为i,则其实是将角标n-i-1        //对应的值和上面的min进行交换        if (i==max)        {            temp = num[n-i-1];            num[n-i-1] = num[min];            num[min] = temp;        }        else        {            temp = num[max];            num[max] = num[n-i-1];            num[n-i-1] = temp;        }        sout(num,n,i);    }}int main(void){    int a[9] = {9,5,8,7,4,6,3,2,1};    int i;    //time(a,8);   //shellSort2(a,9);   selectSort(a,9);    for (i=0 ; i<9 ; i++)    {        printf("%d ",a[i]);    }    return 0;}
0 0