选择排序
选择排序就是不断地从未排序的元素中选择最大(或者最下)的元素放入已经排好序的元素集合中,直到未排序中仅剩一个元素为止
第一步:
第二步:
第三步:
第四步:
第五步:
对数组元素进行降序排序
代码:
#include<stdio.h>
#include<stdlib.h>
void Select_Sort(int arr[], int sz)//选择排序
{
int i = 0;//i表示有序数组的下标
int j = 0;//j表示无序数组的下标
int minIndex = 0;//最小元素的下标
int temp = 0;
//控制对所有元素排序(第一个元素排好之后,有序空间的下标往后移动,开始排后面的元素
for (i = 0; i < sz; i++)
{
minIndex = i;//最小值默认是无序空间第一个元素的下标(也就是i)
//负责在无序空间中找到最小的元素,更新下标minIndx
for (j = i + 1; j < sz; j++)
{
if (arr[minIndex]<arr[j])
minIndex = j;//更新最小值的下标
}
/*第一次时比较开始前,默认数组的第一个元素是整个数组元素中最小
的(即就是默认arr[0]是有序空间最小的元素,然后用它与无序空间
中的最小值比较,从而得到排好序数组的最小元素*/
//选择出最小的元素,放到有序空间中
if (arr[i] < arr[minIndex])
{
temp = arr[minIndex];
arr[minIndex] = arr[i];
arr[i] = temp;
}
}
}
void test(int arr[], int sz)
{
for (int i = 0; i < sz; ++i)
printf("%d ", arr[i]);
printf("\n");
}
int main()
{
int arr[] = { 2, 5, 6, 1, 8, 0, 4, 6, 8, 7, 9 };
int sz = sizeof(arr) / sizeof(arr[0]);
printf("未排序的数组:> ");
test(arr,sz);//输出数组中的元素
Select_Sort(arr, sz);//选择排序
printf("已经排好序的数组:> ");
test(arr, sz);
system("pause");
return 0;
}
运行结果:
使用选择排序对数组进行升序排序
代码:
#include<stdio.h>
#include<stdlib.h>
void Select_Sort(int arr[],int sz)
{
int i = 0;
int j = 0;
int temp = 0;
int minIndex = 0;
for (i = 0; i < sz; ++i)
{
minIndex = i;
for (j = i+1; j < sz; ++j)
{
if (arr[minIndex]>arr[j])
minIndex = j;//更新最小值的下标
}
if (arr[i]>arr[minIndex])
{
temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
}
void test(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz; ++i)
printf("%d ", arr[i]);
printf("\n");
}
int main()
{
int arr[] = { 2, 5, 6, 1, 8, 0, 4, 6, 8, 7, 9 };
int sz = sizeof(arr) / sizeof(arr[0]);
printf("未排序的数组:> ");
test(arr,sz);//输出数组中的元素
printf("\n");
Select_Sort(arr, sz);//直接插入排序
printf("已经有序的数组:> ");
test(arr, sz);
system("pause");
return 0;
}
运行结果:
选择排序的时间复杂度
假设有N个元素需要排序
外层for循环的时间复杂度:
O(N)
内层for循环的时间复杂度:
i=0时,比较N-1次
i=1时,比较N-2次
……
i=N-2时,比较1次
则一共比较了(N-1)+(N-2)+……+2+1=N^2 / 2 - N / 2
故时间复杂度为O(N^2)