引自
直接选择排序和直接插入排序类似,都将数据分为有序区和无序区,所不同的是直接播放排序是将无序区的第一个元素直接插入到有序区以形成一个更大的有序区,而直接选择排序是从无序区选一个最小的元素直接放到有序区的最后。
设数组为a[0…n-1]。
1. 初始时,数组全为无序区为a[0..n-1]。令i=0
2. 在无序区a[i…n-1]中选取一个最小的元素,将其与a[i]交换。交换之后a[0…i]就形成了一个有序区。
3. i++并重复第二步直到i==n-1。排序完成。
1 #include2 #define N 10 3 4 void Display(int *a, int n) 5 { 6 int i; 7 for (i = 0; i < n; i++) { 8 printf("%d ", a[i]); 9 }10 printf("\n");11 }12 13 void SelectionSort(int *a, int n)14 {15 int i, j, index, value;16 17 for (i = 0; i < n - 1; i ++) {18 index = i;19 value = a[i];20 for (j = i + 1; j < n; j ++)21 if (value > a[j]) {22 index = j;23 value = a[j];24 } //找出最小的值之后再交换,即在循环外部交换最小值25 a[index] = a[i];26 a[i] = value;27 Display(a, n);28 }29 }30 31 void main()32 {33 int a[N],i ;34 for(i=0;i
结果:
10 9 8 7 6 5 4 3 2 1 1 9 8 7 6 5 4 3 2 10 1 2 8 7 6 5 4 3 9 10 1 2 3 7 6 5 4 8 9 10 1 2 3 4 6 5 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10
附一个swap交换的问题
inline void Swap1(int &a, int &b){ if (a != b)//若ab相同则结果会出现0,异或自己为0 { a ^= b; b ^= a; a ^= b; }}