排序算法-----选择排序
排序算法-----选择排序
选择排序的基本思想是:
在第一次循环的过程中,将第一个数与后面的数字进行比较,如果后面的数字比这个数字小的话,交换两个数,直到序列的第二个数字到最后一个数字都和第一位置上的数字比较后,最小的数字也就在第一个位置上了,然后进行第二轮循环,第二小的数字就处在第二个位置上了,以此类推,直到整个序列都从小到大排列为止。
具体的案例描述:
4,8,3,2,1,9,6,7,5
过程如下:
(1)第一轮循环<i=0>:
首先数i:4和j:8比较,4<8,大数在后,不动,j++;
4,8,3,2,1,9,6,7,5 --------------- 结果 4,8,3,2,1,9,6,7,5
i j
然后数i:4和j:3比较,4>3,大数在前,交换两个数,j++;
4,8,3,2,1,9,6,7,5 --------------- 结果 3,8,4,2,1,9,6,7,5
i j
然后数i:3和j:2比较,3>2,大数在前,交换两个数,j++;
3,8,4,2,1,9,6,7,5 --------------- 结果 2,8,4,3,1,9,6,7,5
i j
然后数i:2和j:1比较,2>1,大数在前,交换两个数,j++;
2,8,4,3,1,9,6,7,5 --------------- 结果 1,8,4,3,2,9,6,7,5
i j
然后数i:1和j:9比较,1<9,大数在后,不动,j++;
1,8,4,3,2,9,6,7,5 --------------- 结果 1,8,4,3,2,9,6,7,5
i j
然后数i:1和j:6比较,1<6,大数在后,不动,j++;
1,8,4,3,2,9,6,7,5 --------------- 结果 1,8,4,3,2,9,6,7,5
i j
然后数i:1和j:7比较,1<7,大数在后,不动,j++;
1,8,4,3,2,9,6,7,5 --------------- 结果 1,8,4,3,2,9,6,7,5
i j
然后数i:1和j:5比较,1<5,大数在后,不动,j++;
1,8,4,3,2,9,6,7,5 --------------- 结果 1,8,4,3,2,9,6,7,5
i j
第一轮排序结束,最小的值1放在了第一的位置上;
(2)第二轮循环<i=1>:
结果:1,2,8,4,3,9,6,7,5
(3)第三轮循环<i=2>:
结果:1,2,3,8,4,9,6,7,5
(4)第四轮循环<i=3>:
结果:1,2,3,4,8,9,6,7,5
(5)第五轮循环<i=4>:
结果:1,2,3,4,5,9,8,7,6
(6)第六轮循环<i=5>:
结果:1,2,3,4,5,6,9,8,7
(7)第七轮循环<i=6>:
结果:1,2,3,4,5,6,7,9,8
(8)第八轮循环<i=7>:
结果:1,2,3,4,5,6,7,8,9
生育最后一个肯定是最大值,不用调整,整个排序完毕;
一共经历了n-1次循环,因i从零开始,故i<n-1;
j是用来取后面的值与i位置的值进行比较,j从i+1开始,到最后一个结束;
算法如下:
1 #include <stdio.h> 2 int main() { 3 int a[9] = { 4,3,9,8,5,2,1,7,6 }; 4 for (int m = 0; m<9; m++) 5 { 6 if (m != 8) { 7 printf("%d,", a[m]); 8 } 9 else { 10 printf("%d", a[m]); 11 } 12 } 13 printf("\n"); 14 for (int i = 0; i <9 - 1; i++) 15 for (int j = i+1; j<9 ; j++) 16 { 17 if (a[i]>a[j]) { 18 int temp; 19 temp = a[i]; 20 a[i] = a[j ]; 21 a[j] = temp; 22 23 } 24 } 25 for (int m = 0; m<9; m++) 26 { 27 if(m!=8){ 28 printf("%d,", a[m]); 29 } 30 else { 31 printf("%d", a[m]); 32 } 33 34 } 35 getchar(); 36 37 }