• 选择排序


    选择排序:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。

    效率:⊙(n^2)

    伪代码:

    1 SelectionSort(A[0..n-1])
    2 //该算法用选择排序对给定的数组排序
    3 //输入:一个可排序数组A[0..n-1]
    4 //输出:升序排列的数组A[0..n-1]
    5 for i<-0  to n-2 do
    6      min<-i;
    7      for j<- i+1  to n-1 do
    8           if A[j]<A[min]  min<- j
    9      swap A[i] and A[min]

    选择排序代码实现:

     1 result selectionSort(int *intArray,int n){
     2     if(intArray==NULL||n<=0){
     3         return fail;
     4     }
     5     int min,temp;
     6     for(int i=0;i<n-1;i++){//从头遍历数组
     7         min=i;
     8         for(int j=i+1;j<n;j++){//在未排序的数字中寻找最小数的下标min
     9             if(intArray[j]<intArray[min]){
    10                 min=j;
    11             }
    12         }
    13         //这一趟min位置上的数字与i位置上的数字交换
    14         temp=intArray[i];
    15         intArray[i]=intArray[min];
    16         intArray[min]=temp;
    17     }
    18     return success;
    19 }

    完整代码:

    View Code
     1   #include<stdio.h>
     2   #include<malloc.h>
     3   enum result{success,fail};
     4   //构造整型数组,并返回
     5   int* createArray(int n);
     6   //对整型数组的内容选择排序
     7   result selectionSort(int *,int n);
     8   //输出整型数组的内容
     9   void output(int *intArray,int n);
    10   int main(){
    11       int *intArray=NULL;
    12       int count=0;//数组大小
    13       //构造数组
    14       printf("请输入要排序的数字个数:");
    15       scanf("%d",&count);
    16       intArray=createArray(count);
    17       if(intArray==NULL){//数组构造失败
    18           printf("数组构造失败:");
    19           return 0;
    20       }
    21       //选择排序
    22       result r=selectionSort(intArray,count);
    23       if(r==fail){
    24           printf("选择排序失败:");
    25       }else{
    26           printf("选择排序成功:");
    27           output(intArray,count);
    28       }
    29       return 0;
    30   }
    31   int* createArray(int n){
    32       int *intArray=NULL;
    33       if(n>0){
    34           intArray=(int *)malloc(n*sizeof(int));
    35       }else{
    36           return NULL;
    37       }
    38       if(intArray==NULL){
    39           printf("创建数组空间失败");
    40           return NULL;
    41       }
    42       printf("请输入要排序的数字:");
    43       for(int i=0;i<n;i++){
    44           scanf("%d",intArray+i);
    45       }
    46       return intArray;
    47   }
    48   //选择排序关键代码
    49   result selectionSort(int *intArray,int n){
    50       if(intArray==NULL||n<=0){
    51           return fail;
    52       }
    53       int min,temp;
    54       for(int i=0;i<n-1;i++){//从头遍历数组
    55           min=i;
    56           for(int j=i+1;j<n;j++){//在未排序的数字中寻找最小数的下标min
    57               if(intArray[j]<intArray[min]){
    58                   min=j;
    59               }
    60           }
    61           //这一趟min位置上的数字与i位置上的数字交换
    62           temp=intArray[i];
    63           intArray[i]=intArray[min];
    64           intArray[min]=temp;
    65       }
    66       return success;
    67   }
    68   
    69   void output(int *intArray,int n){
    70       if(intArray==NULL||n<=0){
    71           return ;
    72       }
    73       for(int i=0;i<n;i++){
    74           printf("%d ",*(intArray+i));
    75       }
    76       printf("\n");
    77   }

    参考:算法设计与分析基础

  • 相关阅读:
    datasnap的监督功能【3】-TCP链接监督功能
    实体服务规则或值更新设置字段锁定性
    设置指定的单据视图
    启动或停止IIS
    SSMS2014清除登录记录
    未授予用户在此计算机上的请求登录类型
    采购合同手动下推采购订单提示没有NAME属性
    审批流消息中无法获取明细字段
    费用申请单反写费用合同提示第2行总金额超出,但是实际未超出
    调试手机端
  • 原文地址:https://www.cnblogs.com/dann/p/2733016.html
Copyright © 2020-2023  润新知