2、选择排序(Selection Sort)
选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
算法的稳定性: 不稳定 (比如序列【5, 5*, 3】第一趟就将第一个[5]与[3]交换,导致第一个5挪动到第二个5*后面)
时间复杂度: O(n^2);
空间复杂度: O(1)-------没有借助辅助空间;
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include<malloc.h> #include <string.h> int SelectSort(int *p, int n) { int i, j,temp,mini; for (i = 0; i < n - 1; i++) { mini = i; for (j = i + 1; j < n; j++) { if (p[mini] > p[j]) { mini = j; } } temp = p[mini]; p[mini] = p[i]; p[i] = temp; } } int dayin(int *q,int len) { int i; for (i = 0; i < len; i++) { printf("%d ", q[i]); } } void main() { int a[] = { 5,2,4,50,100,3,6,7,8,9 }; int len = sizeof(a) / sizeof(a[0]); SelectSort(a, len); dayin(a, len); char b[] = {"sdsdsdsd"}; printf(" %d", strlen(b)); }
选择排序优化
简单的选择排序,每趟循环只能确定一个元素排序后的定位,我们可以考虑每趟循环确定两个元素(当前趟的最大和最小记录)的位置,从而减少排序所需的循环次数。改进后对n个
数据进行排序,最多只需进行【n/2】趟排序即可
int SelectSort(int *p, int n) { int left=0, right=n-1,temp=0,min,max,i; while(left<=right) { min = left; max = left; for (i = left+1 ; i <= right; i++) { if (p[min] > p[i]) { min = i; } if (p[max] < p[i]) { max = i; } } temp = p[left]; p[left] = p[min]; p[min] = temp; if (left == max) { max = min; } temp = p[right]; p[right] = p[max]; p[max] = temp; ++left; --right; } }