选择排序的两种实现方法

来源:互联网 发布:巴克内尔大学 知乎 编辑:程序博客网 时间:2024/05/22 04:25

选择排序时间复杂度为O(n^2)

我个人感觉选择排序和插入排序非常的相似,选择排序是在有序队列后找到一个最大值放到有序队列后面,插入排序是在有序队列后随便一个数字,插入到有序队列中使之有序。


int i, j;int index;int temp;for (i = 1;i <= num;i++) {temp = arr[i];index = 0;for (j = i+1;j <= num;j++) {if ( temp > arr[j]) {temp = arr[j];index = j;}}if (index) {temp = arr[i];arr[i] = arr[index];arr[index] = temp;}}


不过还有一种树形选择排序这个方法也是比较不错的。时间复杂度为 O(nlogn);

但是这个方法需要很多的多余空间。这个实在是太浪费空间了,在这基础上有人创造出了堆排序,感觉差不多。

准备专门整一下堆排序,就不在这里讲了。


int tier = 1;for (int i = 1;i < num;i++) tier++;int k = pow (2, tier) -1;int k1 = pow (2, tier-1) -1;int *parr = (int*) malloc (sizeof (int) * (k+1));#define MAX 100000for (int i = 1;i <= num;i++) {parr[i+k1] = arr[i];}for (int i = k1+num+1;i <= k;i++) {parr[i] = MAX;}for (int i = 1;i <= num;i++) {for (int j = k;j >= 1;j -= 2) {if (parr[j] < parr[j-1]) {parr[j/2] = parr[j];<span style="white-space:pre"></span>}<span style="white-space:pre"></span>else {<span style="white-space:pre"></span>parr[j/2] = parr[j-1];}}printf ("%d ", parr[1]);int bit = 1;int temp = parr[1];while (2*bit <= k) {if (parr[bit] == parr[bit*2]) {bit *= 2;}if (parr[bit] == parr[bit*2+1]) {bit = bit*2 + 1;}}parr[bit] = MAX;<span style="white-space:pre"></span>}printf ("\n");


0 0
原创粉丝点击