在简单选择排序过程中,所需移动记录的次数比较少。最好情况下,即待排序记录初始状态就已经是正序排列了,则不需要移动记录。
最坏情况下,即待排序记录初始状态是按第一条记录最小,之后的记录从小到大顺序排列,则需要移动记录的次数最多为3(n-1)。简单选择排序过程中需要进行的比较次数与初始状态下待排序的记录序列的排列情况无关。当i=1时,需进行n-1次比较;当i=2时,需进行n-2次比较;依次类推,共需要进行的比较次数是(n-1)+(n-2)+…+2+1=n(n-1)/2,即进行比较操作的时间复杂度为O(n^2),进行移动操作的时间复杂度为O(n)。
简单选择排序是不稳定排序。
C语言实现
简单选择排序算法原理:每次从左至右扫描序列,记下最小值的位置。
输入10个数按从小到大的顺序排列:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#include<stdio.h> main() { int a[10],i,j,k,t; printf("input10numbers:\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); printf("\n"); for(i=0;i<10;i++) { t=i; for(j=i+1;j<10;j++) { if(a[t]>a[j]) { t=j; } } int temp = a[i]; a[i]=a[t]; a[t]=temp; } printf("thesortednumbers:\n"); for(i=0;i<10;i++) printf("%-3d",a[i]); } |
C++实现
用C++描述算法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
template<class datatype> void seqlist<datatype>::insertsort() { int i,j,k; datatype temp; for(i=0;i<last;i++) { k=i; for(j=i+1;j<=last;j++) if(data[j]<data[k]) k=j; if(i!=k) //第i个元素与第k个元素交换 { temp=data[k]; data[k]=data[i]; data[i]=temp; } } delete_data(1); }; |
[1]
数据结构课本上算法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
void Select_Sort(datatype R[],int n) { //对排序表R[1].....R[n]进行冒泡排法,n是记录个数 for(i=1; i<n; i++) /*做n-1趟选取*/ { k=i; /*在i开始的n-i+1个记录中选关键码最小的记录*/ for(j=i+1;j<=n;j++) if(R[j].key<R[k].key) k=j; /*k中存放关键码最小记录的下标*/ if(i!=k) /*关键码最小的记录与第i个记录交换*/ { int temp; temp=R[k]; R[k]=R[i]; R[i]=temp; } } } |
Java实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
public class SimpleSort{ public static void sort(Comparable[] data){ //数组长度 int len=data.length; for(int i=0; i<len; i++){ //记录当前位置 int position = i; //找出最小的数,并用position指向最小数的位置 for(int j=i+1; j<len; j++){ if( data[position].compareTo(data[j]) > 0 ) { position=j; }//endif }//endfor //交换最小数data[position]和第i位数的位置 Comparable temp=data[i]; data[i]=data[position]; data[position]=temp; }//endfor }//endsort public static void main(String[] args) { //在JDK1.5版本以上,基本数据类型可以自动装箱 //int,double等基本类型的包装类已实现了Comparable接口 Comparable[] c={4,9,23,1,45,27,5,2}; sort(c); for(Comparable data:c) { System.out.println(data); } } } |
Objective-C实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
+(void)sort:(NSMutableArray*)array{ inti,y,min; for(i=0;i<[arraycount];i++){ min=i; for(y=i+1;y<[arraycount];y++){ if([[arrayobjectAtIndex:min]intValue]>[[arrayobjectAtIndex:y]intValue]){ min=y; } } if(min!=i){ [arrayexchangeObjectAtIndex:iwithObjectAtIndex:min]; } } } |
PHP实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
function sort_select( $arr ){ for( $i=0; $i<count($arr); $i++ ){ $t = $i; for( $j=$i+1; $j<count($arr); $j++ ){ if( $arr[ $j ] < $arr[ $t ] ){ $t = $j; } } if( $t != $i ){ $arr[ $i ] ^= $arr[ $t ]; $arr[ $t ] ^= $arr[ $i ]; $arr[ $i ] ^= $arr[ $t ]; } } return $arr; } |
C#实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public void SimpleSelectSort(int[] array) { int tmp=0; int t=0;//最小数标记 for(int i=0; i<array.Length; i++) { t=i; for(int j=i+1; j<array.Length; j++) { if(array[t]>array[j]) { t=j; } } tmp=array[i]; array[i]=array[t]; array[t]=tmp;
Python3实现 def select_sort(array): lenth = len(array) for i in range(lenth): for j in range(i, lenth): if array[j] < array[i]: array[i], array[j] = array[j], array[i] return array |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#include<stdio.h> main() { int a[10],i,j,k,t; printf("input10numbers:\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); printf("\n"); for(i=0;i<10;i++) { t=i; for(j=i+1;j<10;j++) { if(a[t]>a[j]) { t=j; } } int temp = a[i]; a[i]=a[t]; a[t]=temp; } printf("thesortednumbers:\n"); for(i=0;i<10;i++) printf("%-3d",a[i]); } |