选择排序

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

效率:⊙(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   }

 

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

 

posted @ 2012-10-21 21:45  Dann  阅读(164)  评论(0编辑  收藏  举报