您的位置:首页 > 其它

中位数之第K小的线性选择算法(续)

2011-09-23 10:53 218 查看
前一段时间翻译了中位数之第K小的线性选择算法,由于翻译水平有限,感觉对上文不是很满意。不过中位数算法的大致意思我想已经在上文中说的比较清楚了,在这我就不多说了。本文的主要目的是对于算法的实现。
最近抽了些时间把该算法做了,基本是按照上文的思路走的。突然心情激动了一下,就想把代码贴上来,主要目的还是想和大家交流。毕竟靠一个人的力量想学好算法那还真是有些难度的。

不浪费时间了,直接看代码吧!

/*** 从array[left, right] 中找出第 k 小的数 ***/

int selection(int array[], int left, int right, int k) {           if (left > right || (k - 1) > right - left) {                  return -1;          }            if (left == right) {                  return array[left];          }            int mid = partition(array, left, right);            int len = mid - left;          if ((k - 1) == len) {                  return array[mid];          } else if ((k - 1) < len) {  /*** 要找的数在左集合中 ***/                  return selection(array, left, mid - 1, k);          } else {  /*** 要找的数在右集合中 ***/                  return selection(array, mid + 1, right, k - len - 1);          }  }

/** 对数组进行一次划分,[left, mid - 1] [mid] [mid + 1, right] ***/

int partition(int array[], int low, int high) {          int x = array[low];          int m = low;          int i;          for (i = low + 1; i <= high; i++) {                  if (array[i] < x) {                          swap(array, ++m, i);                  }          }          swap(array, low, m);            return m;  }

int swap(int a[], int i, int j) {          int t = a[i];          a[i] = a[j];          a[j] = t;            return 0;  }

测试:找出数组中第K小元素

int main()  {          int array[] = {3,7,9,4,2,8};          int k;          printf("Please input k: ");          scanf("%d",&k);          printf("%d",selection(array, 0, 6, k));          return 0;  }

测试截图:编译环境为codeblocks



本文出自 “SuperFC之替天行道” 博客,请务必保留此出处http://fengchaokobe.blog.51cto.com/2246555/1201135
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐