int SEL(int *A,int m,int p,int k,int r) { int temp = 0; int n = 0,i = 0,j = 0; if(p - m + 1 <= r) { INSERTIONSORT(A,m,p); return m + k - 1; } while(1) { n = p - m + 1; for(i = 1;i <= n/r;i++) { INSERTIONSORT(A,m + (i - 1) * r,m + i * r - 1); //将中间值收集到A的前部 temp = A[m+i-1]; if(r%2) r++; A[m+i-1] = A[m+(i-1)*r+r/2-1]; A[m+(i-1)*r+r/2-1] = temp; } if((n / r) % 2) j = (n / r) / 2; else j = (n / r) / 2 + 1; j = SEL(A,m,m + n/r - 1,j,r); temp = A[m]; A[m] = A[j]; A[j] = A[m]; j = p + 1; j = PARTITION(A,m,j); if(j - m + 1 == k) return j; else if(j - m + 1 > k) p = j -1; else { k = k - (j - m + 1); m = j + 1; } } }
/* [0,1) */ void BUCKETSORT(int A[], int array_size) { int n = array_size; for (int i = 1; i <= n; i++) insert_list(B[n*A[i]], A[i]); for (int i = 0; i <= n - 1; i++) INSERTIONSORT(B[i], B[i].array_size); }