上次联系的算法是冒泡排序,不知道小伙伴们还记得不,中间穿插了一下比特币相关的分享,嘿嘿。今天来分享一下选择排序。
算法描述:选择排序是从数组中选择最大(小)的元素放到数组的最后一个,然后往前移,接着从剩余未排序的元素中选择最大(小)的元素放到倒数第二个,依次类推,直到第二个元素被放好。
算法代码:
void selection_sort(int arr[], int n){ int i, j, tmp, maxidx; for (i = n - 2; i >= 0; --i) { maxidx = i + 1; for (j = 0; j 1; ++j) { if (arr[j] > arr[maxidx]) maxidx = j; } if (maxidx != i + 1) { tmp = arr[i + 1]; arr[i + 1] = arr[maxidx]; arr[maxidx] = tmp; } }}
测试代码:
#include void selection_sort(int arr[], int n);int main(){ int arr[] = { 8, 36, 23, 2, 17, 6}; int N = sizeof(arr) / sizeof(int), i = 0; for (i = 0; i < N; ++i) { printf("%d ", arr[i]); } printf("\n"); selection_sort(arr, N); for (i = 0; i < N; ++i) { printf("%d ", arr[i]); } printf("\n"); return 0;}
运行结果:
排序过程:
上述过程是外层for循环的第一个循环的过程,之后会重复到i=0,然后就排序完成了。选择的意思呢就是,从剩余未排序的元素里面选择出最大(小)的元素,放到队尾(头),一直到没有未排序的元素为止。
选择排序的复杂度:
时间复杂度:
平均情况:O(n²)
最好情况:O(n²)
最坏情况:O(n²)
空间复杂度:
辅助空间:O(1)
今天就先到这里吧,如果感觉有用的话希望你可以分享给自己的同学、伙伴。谢谢你啦。
-------------------------------------------------------------------------
欢迎关注 [懒人漫说] 公众号 ^_^