#include<iostream>
using namespace std
int main()
{
string ans[1000],load
int i=0
int j=0
while(cin>>ans[i])
{
i++
while(ans[i][j])
{
if(ans[i][j]==''){
strcpy(ans[i+1],ans[i],j)
break}
j++
}
}
}
这个问题可以设想如果数组就是从小到大的,会发生什么情况:如果就是从小到大的数组,if 语句没用了,那么直接执行a[iPos]=a[i], 这就会出现问题了,如果你没 对iPos赋值,那么程序会报错,如果对iPos赋值,那么该赋什么值?毫无疑问是i,如果和i不同,那么意味着每次循环a 数组中iPos处的值都要改变为a[i],而a 就是从小到大的不需要改变,也会出问题。再看一下你这个程序6为什么没了?
因为你这个数组比较特殊,10到1递减的,所以第1次排序是10和1对换,iPos=9;即1所在的位置。
第2次是9和2对换iPos=8;即2所在的位置
第3次是8和3对换iPos=7;即3所在的位置
第4次是7和4对换iPos=6;即4所在的位置
第5次是6和5对换iPos=5;即5所在的位置
注意在第5次排序之后已经得到从小到大的数组了:1、2、3、4、5、6、7、8、9、10;
正常情况下后面的排序不会影响结果了。
后面的6、7、8、9、10再排序,这就和刚开始说的情况一样了,这些本来就是从小到大的,if语句没用了,那么也就意味着iPos不会改变了,而上面执行到iPos=5,所以后面每次循环执行a[iPos]=a[i],把i 处的值赋给a[iPos],也就是赋给a[5], 而a[5]的值是6,就是说后面每次排序会把6、7、8、9、10替换6最终的结果是a[5]=10,6没了。
所以可以看到如果当前循环i处a[i]就是最小值,是不需要进行替换操作的。但是如果不设置iPos=i,会导致执行a[iPos]=a[i],改变a[iPos]的值。
选择排序是一种简单直观的排序算法。
工作原理:
每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
性能:
选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)。
选择排序的时间复杂度是O(n^2)
思想:
n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:
①初始状态:无序区为R[1..n],有序区为空。
②第1趟排序
在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
……
③第i趟排序
第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。该趟排序从当前无序区中选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
C语言版代码:
#include <stdio.h>#include <math.h>
#define MAX_SIZE 101
#define SWAP(x, y, t) ((t) = (x), (x) = (y), (y) = (t))
void sort(int[], int) /* selection sort */
int main()
{
int i, n
int list[MAX_SIZE]
printf("Enter the number of numbers to generate: ")
scanf_s("%d", &n)
if (n < 1 || n > MAX_SIZE){
fprintf(stderr, "Improper value of n\n")
exit(1)
}
for (i = 0 i < n i++){ /* randomly generate numbers */
list[i] = rand() * 1000
printf("%d ", list[i])
}
sort(list, n)
printf("\n Sorted array:\n")
for (i = 0 i < n i++) /* print out sorted numbers */
printf("%d ", list[i])
printf("\n")
return 0
}
void sort(int list[], int n)
{
int i, j, min, temp
for (i = 0 i < n - 1 i++){
min = i
for (j = i + 1 j < n j++)
if (list[j] < list[min])
min = j
SWAP(list[i], list[min], temp)
}
}