编程算法 - 排序分割 代码(C)

排序分割 代码(C)


本文地址: http://blog.csdn.net/caroline_wendy


排序分割, 把一个数组分为, 大于k\小于k\等于k的三个部分.

可以使用快速排序的Partition函数, 进行处理, 把大于k的放在左边, 小于k的放在右边.

使用一个变量记录中间的位置, 则时间复杂度O(3n/2).


代码:

[cpp]  view plain copy
  1. /* 
  2.  * main.cpp 
  3.  * 
  4.  *  Created on: 2014.9.18 
  5.  *      Author: Spike 
  6.  */  
  7.   
  8. /*eclipse cdt, gcc 4.8.1*/  
  9.   
  10. #include <iostream>  
  11. #include <list>  
  12. #include <queue>  
  13. #include <string.h>  
  14. #include <stdlib.h>  
  15.   
  16. using namespace std;  
  17.   
  18. int RandomInRange(int min, int max) {  
  19.     return rand()%(max-min+1) + min;  
  20. }  
  21.   
  22. void Swap(int* num1, int* num2) {  
  23.     int tmp = *num1;  
  24.     *num1 = *num2;  
  25.     *num2 = tmp;  
  26. }  
  27.   
  28. int PartitionK (int data[], int length, int k)  
  29. {  
  30.     if (data == NULL || length <= 0)  
  31.         return -1;  
  32.     int small = -1;  
  33.     int index = 0;  
  34.     for (index=0; index<length; ++index) {  
  35.         if (data[index] < k) {  
  36.             small++;  
  37.             if (small != index)  
  38.                 Swap(&data[small], &data[index]);  
  39.         }  
  40.     }  
  41.   
  42.     int pos = ++small; //记录位置  
  43.   
  44.     small = length;  
  45.     index = 0;  
  46.     for (index = length-1; index>=pos; index--) {  
  47.         if (data[index] > k) {  
  48.             small--;  
  49.             if (small != index)  
  50.                 Swap(&data[small], &data[index]);  
  51.         }  
  52.     }  
  53.     return --small;  
  54. }  
  55.   
  56. int main (void)  
  57. {  
  58.     int data[] = {1, 3, 2, 5, 2, 0, 5, 2, -1, 0, 4};  
  59.     int length = sizeof(data)/sizeof(data[0]);  
  60.     PartitionK(data, length, 2);  
  61.     for (int i=0; i<length; ++i) {  
  62.         cout << data[i] << " ";  
  63.     }  
  64.     cout << endl;  
  65.     return 0;  
  66. }  

输出:

[plain]  view plain copy
  1. 1 0 -1 0 2 2 2 3 5 5 4   

你可能感兴趣的:(算法)