思路
选择排序是不稳定排序。
有 n 个数据的序列,不管原始序列是什么状态,第 i 趟排序都需要经过 n-i 次元素之间的比较,比较总次数为 n(n-1)/2,所以选择排序的时间复杂度为 O(n²)。
选择排序的思路是这样的:
首先,遍历,找到数组中最小(大)的元素,拿出来,将它和数组的第一个元素交换位置,此时可以认为第一个元素有序了;
第二步,在剩下的元素中继续寻找最小(大)的元素,拿出来,和数组的第二个元素交换位置,此时前两个元素有序了;
如此循环,直到整个数组排序完成。
C
#include<stdio.h>
void SelectSort(int arr[], int len);
int main(void)
{
int arr[] = {20, 32, 4, 33, 72, 56, 88, 60, 46, 98};
int len = (int)sizeof(arr)/sizeof(*arr);//获取数组长度
SelectSort(arr, len);
int i;
for(i=0; i<len; i++)
{
printf("%d\n", arr[i]);
}
return 0;
}
void SelectSort(int arr[], int len)
{
int i;
int j;
int min;
for(i=0; i<len-1; i++)
{
min = i;//将最小元素的下标给min
for(j=i+1; j<len; j++)
{
if(arr[j] < arr[min])
{
min = j;
}
}
//交换两个元素的位置,将小元素放到数组开头
int temp;
temp = arr[i];
arr[i] = arr[min];
arr[min] = temp;
}
}
C#
public class Program
{
public static void Main(string[] args)
{
int[] arr = { 20, 32, 4, 33, 72, 56, 88, 60, 46, 98 };
Select_Sort(arr);
for (int i = 0; i < arr.Length; i++)
{
Console.WriteLine(arr[i]);
}
Console.ReadLine();
}
public static void Select_Sort(int[] arr)
{
int i;
int j;
int min;
for (i = 0; i < arr.Length - 1; i++)
{
min = i;
for (j = i + 1; j < arr.Length; j++)
{
if (arr[j] < arr[min])
{
min = j;//交换两个元素的位置,将小元素放到数组开头
}
}
//交换两个元素的位置,将小元素放到数组开头
int temp;
temp = arr[i];
arr[i] = arr[min];
arr[min] = temp;
}
}
}