从0~n-1个元素中选择最小的元素,与第0个元素交换;从1~n-1个元素中选择最小的元素,与第一个元素位置交换,依次类推。(选择排序和冒泡排序比较近似,可对照学习)
选择排序相较冒泡排序,移动的次数较少,所以选择排序比冒泡排序效果更好点。
//选择排序
void selectSort(pArrayList list)
{
int minIndex;
int tmp;
//起始位置不断递增
for(int i=0;i<list->length;i++)
{
//找出从起始位置到最后一个元素的最小值,并返回它的位置
minIndex=selectMiniElem(list,i);//i表示起始位置
if(minIndex!=i)//如果二者位置不等,则交换它们
{
tmp=list->data[i];
list->data[i]=list->data[minIndex];
list->data[minIndex]=temp;
}
}
}
//返回i~length中最小的元素的下标
int selectMiniElem(pArrayList list,int index)
{
//min初始为很大的数
int min = 100000;
int minIndex;
for(int i=index;i<list->length;i++)
{
if(list->data[i]<min)
{
min=list->data[i];
minindex=i;
}
}
return minindex;
}
//C++精简版
int temp;
int a[8] = {2,3,1,6,4,7,0,8};
for (int i = 0; i < 8; i++)
{
int m = i;
for (int j = i + 1; j < 8; j++)
{
if (a[j] < a[m])
{
m = j;
}
}
temp = a[i];
a[i] = a[m];
a[m] = temp;
cout << a[i] << " ";
}
注:选择排序与冒泡排序的异同:
选择排序:每次找到最小的元素,但是它只是将最小元素与首位元素交换位置;
冒泡排序:每次找到最大的元素,但是在查找的过程中需要不断地移动元素的位置。
选择排序相较冒泡排序,移动的次数较少,所以选择排序比冒泡排序效果更好点。