abc_begin

导航

排序_快速排序

 

 1 void quickSort(LineList R[], int first, int end)
 2 {
 3     int i, j;
 4     LineList temp;
 5     i = first;
 6     j = end;
 7     temp = R[i];
 8     R[0] = R[i];
 9 
10     while (i < j) 
11     {
12         while (i < j && R[0].key <= R[i].key) {
13             j--;
14         }
15         if (i < j) {
16             R[i] = R[j];
17             i++;
18         }
19 
20         while (i < j && R[0].key >= R[i].key) {
21             i++;
22         }
23         if (i < j) {
24             R[j] = R[i];
25             j--;
26         }
27 
28         R[i] = R[0];
29 
30         if (first < i - 1) 
31         {
32             quickSort(R, first, i - 1);
33         }
34         if (i + 1 < end) {
35             quickSort(R, i + 1, end);
36         }
37     }
38 }

 

pivot选取3值平均

 1 ElementType Median3( ElementType A[], int Left, int Right )  
 2 {   
 3     int Center = (Left+Right) / 2;  
 4     if ( A[Left] > A[Center] )  
 5         Swap( &A[Left], &A[Center] );  
 6     if ( A[Left] > A[Right] )  
 7         Swap( &A[Left], &A[Right] );  
 8     if ( A[Center] > A[Right] )  
 9         Swap( &A[Center], &A[Right] );  
10     /* 此时A[Left] <= A[Center] <= A[Right] */  
11     Swap( &A[Center], &A[Right-1] ); /* 将基准Pivot藏到右边*/  
12     /* 只需要考虑A[Left+1] … A[Right-2] */  
13     return  A[Right-1];  /* 返回基准Pivot */  
14 }  
15    
16 void Qsort( ElementType A[], int Left, int Right )  
17 { /* 核心递归函数 */   
18      int Pivot, Cutoff, Low, High;  
19          
20      Pivot = Median3( A, Left, Right ); /* 选基准 */   
21      Low = Left; High = Right-1;  
22      while (1) { /*将序列中比基准小的移到基准左边,大的移到右边*/  
23           while ( A[++Low] < Pivot ) ;  
24           while ( A[--High] > Pivot ) ;  
25           if ( Low < High ) Swap( &A[Low], &A[High] );  
26           else break;  
27      }  
28      Swap( &A[Low], &A[Right-1] );   /* 将基准换到正确的位置 */   
29      Qsort( A, Left, Low-1 );    /* 递归解决左边 */   
30      Qsort( A, Low+1, Right );   /* 递归解决右边 */    
31 
32 }  
33    
34 void QuickSort( ElementType A[], int N )  
35 { /* 统一接口 */  
36      Qsort( A, 0, N-1 );  
37 }  
38  

 

posted on 2017-10-09 19:38  LastBattle  阅读(517)  评论(0编辑  收藏  举报