选择排序:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。
效率:⊙(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 }
参考:算法设计与分析基础