织梦CMS - 轻松建站从此开始!

罗索

快速排序以及寻找第K大元素

落鹤生 发布于 2010-04-22 21:58 点击:次 
排序算法:快速排序Quick Sort,以及寻找第K大元素
TAG:

  1. #include <iostream> 
  2. #include <stdlib.h> 
  3. using namespace std; 
  4. int count=0; 
  5. void run(int *pData, int left, int right) 
  6. int i,j; 
  7. int middle, iTemp; 
  8. int k; 
  9. i = left; 
  10. j = right; 
  11. middle = pData[left+(rand()%(right-left))]; 
  12. //middle= pData[(left+right)/2]; 
  13. do
  14.    while((pData[i]<middle)&&(i<right)) 
  15.     i++; 
  16.    while((pData[j]>middle)&&(j>left)) 
  17.     j--; 
  18.    if(i<=j) 
  19.    { 
  20.     iTemp=pData[j]; 
  21.     pData[j]=pData[i]; 
  22.     pData[i]=iTemp; 
  23.     i++; 
  24.     j--; 
  25.     count++; 
  26.     
  27.    } 
  28.  
  29. }while(i<j); 
  30. cout<<"middle = "<<middle<<" i="<<i<<" j="<<j<<endl; 
  31.     for(k=0; k<11; k++) 
  32.      cout<<pData[k]<<" "
  33.     cout<<endl; 
  34. if(left<j) 
  35.    run(pData,left,j); 
  36. if(right>i) 
  37.    run(pData,i,right); 
  38.  
  39.  
  40. void QuickSort(int *pData,int Count) 
  41. run(pData, 0, Count-1); 
  42. void QuickSort2(int inta[],int low,int high) 
  43.    int i=low,j=high; 
  44.    int temp = inta[low]; 
  45.    while(i<j) 
  46.    { 
  47.     while (i<j && temp<=inta[j]) 
  48.      j--; 
  49.     if(i<j) 
  50.     { 
  51.      inta[i]=inta[j]; 
  52.         i++; 
  53.     } 
  54.     while(i<j && temp >=inta[i]) 
  55.      i++; 
  56.     if(i<j) 
  57.     { 
  58.      inta[j]=inta[i]; 
  59.      j--; 
  60.     } 
  61.    } 
  62.    inta[i]=temp; 
  63.    int k=0; 
  64.    for( k=0; k<11; k++) 
  65.    cout<<inta[k]<<" "
  66. cout<<endl; 
  67.        if(i<high) QuickSort2(inta,i+1,high); 
  68.           if(low<i) QuickSort2(inta,low,i-1); 
  69. void main() 
  70. int data[]={10,9,8,7,11,6,5,4,3,2,1}; 
  71. //int data[] = {1,2,3,4,5,6,7,8,9,10,11}; 
  72. // QuickSort(data, 11); 
  73. QuickSort2(data, 0, 10); 
  74. cout<<"++++++++++++++++++++++++++++++++++++++\n"
  75. for(int i=0; i<11; i++) 
  76.    cout<<data[i]<<" "
  77. cout<<endl; 
  78. cout<<"count = "<<count; 
  79.  
  80. /*******************************************************************************************************************************/ 
  81.  
  82. #include <iostream> 
  83. #include <string> 
  84. #include <vector> 
  85. using namespace std; 
  86. template <typename T> 
  87. int pivotIndex(vector<T>& v, int first, int last) 
  88. int mid, scanUp, scanDown; 
  89. T pivot, temp; 
  90. if (first == last) 
  91.    return last; 
  92. else if (first == last -1) 
  93.    return first; 
  94. else 
  95.    mid = (last + first)/2; 
  96.    pivot = v[mid]; 
  97.  
  98.    v[mid] = v[first]; 
  99.    v[first] = pivot; 
  100.  
  101.    scanUp = first + 1; 
  102.    scanDown = last - 1; 
  103.    
  104.    for (;;) 
  105.    { 
  106.     while (scanUp <= scanDown && v[scanUp] < pivot) 
  107.      scanUp++; 
  108.     while (pivot < v[scanDown]) 
  109.      scanDown--; 
  110.  
  111.     if (scanUp >= scanDown) 
  112.      break
  113.     temp = v[scanUp]; 
  114.     v[scanUp] = v[scanDown]; 
  115.     v[scanDown] = temp; 
  116.  
  117.     scanUp++; 
  118.     scanDown--; 
  119.    } 
  120.    v[first] = v[scanDown]; 
  121.    v[scanDown] = pivot; 
  122.    return scanDown; 
  123. template <typename T> 
  124. void quicksort(vector<T>& v, int first, int last) 
  125. int pivotLoc; 
  126. T temp; 
  127. if (last - first <= 1) 
  128.    return ; 
  129. else if (last - first == 2) 
  130.    if (v[last-1] < v[first]) 
  131.    { 
  132.     temp = v[last-1]; 
  133.     v[last-1] = v[first]; 
  134.     v[first] = temp; 
  135.    } 
  136.    return ; 
  137. else 
  138.    pivotLoc = pivotIndex(v, first, last); 
  139.    quicksort(v, first, pivotLoc); 
  140.    quicksort(v, pivotLoc+1, last); 
  141. int main() 
  142. int intList[] = {2,56,23,12,599,1,3,67 
  143. vector<int> v(intList, intList+sizeof(intList)/sizeof(int)); 
  144.  
  145. quicksort(v, 0, sizeof(intList)/sizeof(int)); 
  146. for(int i=0; i< sizeof(intList)/sizeof(int); i++) 
  147.    cout<<v[i]<<" "
  148. cout<<endl; 
  149. return 0; 
  150.  
  151. /******************************************************************************/ 
  152.  
  153. template <typename T> 
  154. void findK(vector<T>& v, int first, int last, int k) 
  155. int index; 
  156. index = pivotIndex(v, first, last);/* 中间值*/ 
  157. if (index == k) 
  158.    return
  159. else if(k < index) 
  160.    findk(v, first, index, k); 
  161. else 
  162.    findk(v, index+1, last, k); 

 

(linzhangkun)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201004/9229.html]
本文出处:百度博客 作者:linzhangkun
顶一下
(1)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容