1.选择排序(SelectSort):选择排序是一种较为简单的排序方法。它是每次在待排序元素中找到最大或者最小的元素,存放在序列的起始位置,直到所有的数据排完为止。
如图:
从图中我们再来看一下选择排序的过程,假设总共n个元素。首先,第一趟拿初始序列中的第一个元素和后面的元素依次作比较,(以从小到大排序为例)如果大于,就不断进行交换,(当然在不断的交换过程中第一个元素在不断发生改变),最后一次比较完成之后,最小的元素被放在了序列中第一个元素的位置。然后进行第二趟比较,拿第二个元素和后面的元素依次作比较,如果大于则交换,最后一次比较完成之后,次小的元素便被挪到了第二个位置.........依次类推,最多经过n-1次比较便可以完成排序。
2.算法分析
时间复杂度:显然,选择排序的时间复杂度为:O(N^2);
空间复杂度:没有额外的空间开销,故空间复杂度为:O(1);
稳定性:不稳定,原因如图:排序后,两个5的顺序发生了变化。
3.源代码:
void PrintSort(int arr[],size_t size)
{
size_t i=0;
for(; i<size; ++i)
{
printf(" %d ",arr[i]);
}
printf("\n");
}
void Swap(int *x,int *y)
{
*x^=*y;
*y^=*x;
*x^=*y;
}
void SelectSort(int arr[],size_t size)
{
size_t i=0;
size_t j=0;
for(; i<size-1; ++i)
{
for(j=i; j<size; ++j)//找出带排序元素中最小的元素放在arr[i]处
{
if(arr[i]>arr[j])
{
Swap(&arr[i],&arr[j]);
}
}
printf("第%d趟比较结果:",i+1);
PrintSort(arr,size);
printf("\n");
}
}
int main()
{
int arr[]={5,3,9,21,16,2};
size_t size=sizeof(arr)/sizeof(arr[0]);
SelectSort(arr,size);
//PrintSort(arr,size);
system("pause");
return 0;
}
4.运行结果