(1) Select the median, according to the coordinates, the three take one of them
(2) The data is divided into two parts, compared with the median value, respectively.
(3) The same method is used in each of the two parts, divided into smaller two parts, until no further separation
(4) Qksort in the recursion, can guarantee a[0]~a[j] completely sorted, so i = j+1;
Code:
[email protected]:/mnt/shared/appbox/qksort# cat qksort.c#include <stdlib.h> #include <stdlib.h># Include <string.h> #include <unistd.h> #include <stdio.h>static int compare_int (const void *int1, const void *int2) {if (* (const int *) Int1 = = * (const int *) INT2) return 0; return * (const int *) INT1 > * (const int *) Int2? 1:-1;} static int get_mid_value (int *data) {if (Compare_int (&data[0], &data[1]) >0)//d[0]>d[1] { if (Compare_int (&data[0], &data[2]) > 0) return compare_int (&data[1], &d ATA[2]) > 0? DATA[1]: data[2]; else return data[0]; } else//d[0] < d[1] {if (Compare_int (&data[0], &data[2]) > 0)//d[0] > D[2] return data[0]; D[2]<D[0]<D[1], return d[0] else//d[0] < d[2] Return Compare_int (&data[1], &data[2]) > 0? DATA[2]:d ata[1]; } return-1;} static int partition (int *a, int esize, int i, int k, int (*compare) (const void *key1, const void *key2)) {int m; int mid, middle; int r[3]; int temp; R[0] = (rand ()% (k-i+1) + i); R[1] = (rand ()% (k-i+1) + i); R[2] = (rand ()% (k-i+1) + i); MID = Get_mid_value (r); middle = a[mid]; printf ("r[0]:%d, r[1]:%d, r[2]:%d, mid:%d,middle:%d\n", R[0],r[1],r[2],mid, middle); i--; k++; while (1) {do {k--; }while (Compare (&a[k], &middle) > 0); do {i++; }while (Compare (&a[i], &middle) < 0); if (i>=k) break; else {temp = a[i]; A[i] = a[k]; A[K] = temp; }} return k;} int Qksort (void *data, int size, int esize, int i, int k, int (*compare) (const void *key1, const void *key2)) {int J int m; while (I < k) {if (j = partition (data, esize, I, K, compare)) < 0) Retu rn-1; if (qksort (data, size, esize, I, J, compare) < 0) return-1; i = j + 1; } return 0;} int main (int argc, char *argv[]) {int ret; int I, j, K; i = 11; j = 12; int array[10]= {1,4,7,2,5,8,3,6,9,10}; printf ("\n******************compare_init test**********************\n"); printf ("Compare_int (&i, &j) =%d\n", Compare_int (&i, &j)); printf ("Compare_int (&j, &i) =%d\n", Compare_int (&j, &i)); printf ("Compare_int (&i, &i) =%d\n", Compare_int (&i, &i)); printf ("\n******************partition test**********************\n "); Qksort (Array, ten, 4, 0, 9, compare_int); for (i=0; i<10; i++) printf ("%d", array[i]); printf ("\ n"); return 0;}
Execution Result:
[Email protected]:/mnt/shared/appbox/qksort#./qksort
Compare_init test**********************
Compare_int (&i, &j) =-1
Compare_int (&j, &i) =1
Compare_int (&i, &i) =0
Partition test**********************
R[0]:3, R[1]:6, R[2]:7, Mid:6,middle:3
R[0]:1, R[1]:2, R[2]:1, Mid:1,middle:3
r[0]:0, r[1]:0, R[2]:1, mid:0,middle:1
R[0]:6, R[1]:5, R[2]:8, Mid:6,middle:4
R[0]:6, R[1]:5, R[2]:9, Mid:6,middle:7
R[0]:5, R[1]:4, R[2]:4, Mid:4,middle:5
R[0]:5, R[1]:5, R[2]:6, Mid:5,middle:6
R[0]:9, R[1]:7, R[2]:7, Mid:7,middle:8
R[0]:8, R[1]:8, R[2]:8, Mid:8,middle:9
1 2 3 4 5 6 7 8 9 10
[Email protected]:/mnt/shared/appbox/qksort#
To increase the printing of the process:
[email protected]:/mnt/shared/appbox/qksort# cat qksort.c#include <stdlib.h> #include <stdlib.h># Include <string.h> #include <unistd.h> #include <stdio.h>static int compare_int (const void *int1, const void *int2) {if (* (const int *) Int1 = = * (const int *) INT2) return 0; return * (const int *) INT1 > * (const int *) Int2? 1:-1;} static int get_mid_value (int *data) {if (Compare_int (&data[0], &data[1]) >0)//d[0]>d[1] { if (Compare_int (&data[0], &data[2]) > 0) return compare_int (&data[1], &d ATA[2]) > 0? DATA[1]: data[2]; else return data[0]; } else//d[0] < d[1] {if (Compare_int (&data[0], &data[2]) > 0)//d[0] > D[2] return data[0]; D[2]<D[0]<D[1], return d[0] else//d[0] < d[2] Return Compare_int (&data[1], &data[2]) > 0? DATA[2]:d ata[1]; } return-1;} static int partition (int *a, int esize, int i, int k, int (*compare) (const void *key1, const void *key2)) {int m; int mid, middle; int r[3]; int temp; R[0] = (rand ()% (k-i+1) + i); R[1] = (rand ()% (k-i+1) + i); R[2] = (rand ()% (k-i+1) + i); MID = Get_mid_value (r); middle = a[mid]; printf ("r[0]:%d, r[1]:%d, r[2]:%d, mid:%d,middle:%d\n", R[0],r[1],r[2],mid, middle); i--; k++; while (1) {do {k--; }while (Compare (&a[k], &middle) > 0); do {i++; }while (Compare (&a[i], &middle) < 0); if (i>=k) break; else {temp = a[i]; A[i] = a[k]; A[K] = temp; }} return k;} int Qksort (void *data, int size, int esize, int i, int k, int (*compare) (const void *key1, const void *key2)) {int J int m; while (I < k) {printf ("\ n--------------------------------------------------\ n"); printf ("i=%d, k=%d\n", I, k); for (m=0; m<10; m++) printf ("%d", ((int *) data) [M]); printf ("\ n"); if (j = partition (data, esize, I, K, compare)) < 0) return-1; printf ("j=%d, a[j]:%d\n", J, ((int *) data) [j]); for (m=0; m<10; m++) printf ("%d", ((int *) data) [M]); printf ("\ n"); if (qksort (data, size, esize, I, J, compare) < 0) return-1; for (m=0; m<10; m++) printf ("%d", ((int *) data) [M]); printf"\ n"); i = j + 1; } return 0;} int main (int argc, char *argv[]) {int ret; int I, j, K; i = 11; j = 12; int array[10]= {1,4,7,2,5,8,3,6,9,10}; printf ("\n******************compare_init test**********************\n"); printf ("Compare_int (&i, &j) =%d\n", Compare_int (&i, &j)); printf ("Compare_int (&j, &i) =%d\n", Compare_int (&j, &i)); printf ("Compare_int (&i, &i) =%d\n", Compare_int (&i, &i)); printf ("\n******************partition test**********************\n"); Qksort (Array, ten, 4, 0, 9, compare_int); for (i=0; i<10; i++) printf ("%d", array[i]); printf ("\ n"); return 0;} [email protected]:/mnt/shared/appbox/qksort#
Output:
[email protected]:/mnt/shared/appbox/qksort#./qksort ******************compare_init test******************* Compare_int (&i, &j) =-1compare_int (&j, &i) =1compare_int (&i, &i) =0****************** Partition test**********************--------------------------------------------------i=0, k=91 4 7 2 5 8 3 6 9 r[0] : 3, R[1]:6, R[2]:7, mid:6,middle:3j=2, a[j]:21 3 2 7 5 8 4 6 9--------------------------------------------------i=0, K =21 3 2 7 5 8 4 6 9 r[0]:1, R[1]:2, R[2]:1, Mid:1,middle:3j=1, a[j]:21 2 3 7 5 8 4 6 9----------------------------- ---------------------i=0, k=11 2 3 7 5 8 4 6 9 r[0]:0, r[1]:0, R[2]:1, Mid:0,middle:1j=0, a[j]:11 2 3 7 5 8 4 6 9 10 1 2 3 7 5 8 4 6 9 1 2 3 7 5 8 4 6 9 Ten 1 2 3 7 5 8 4 6 9--------------------------------------------------i=3, k=91 2 3 7 5 8 4 6 9 R[0]:6, R[1]:5, R[2]:8, Mid:6,middle:4j=3, a[j]:41 2 3 4 5 8 7 6 9 1 2 3 4 5 8 7 6 9------------- -------------------------------------i=4, K=91 2 3 4 5 8 7 6 9 R[0]:6, R[1]:5, R[2]:9, Mid:6,middle:7j=6, a[j]:71 2 3 4 5 6 7 8 9----------------------------- ---------------------i=4, k=61 2 3 4 5 6 7 8 9 R[0]:5, R[1]:4, R[2]:4, Mid:4,middle:5j=4, a[j]:51 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9--------------------------------------------------i=5, k=61 2 3 4 5 6 7 8 9 R[0]:5, R[1]:5, R[2]:6, Mid:5,middle:6j=5, a[j]:61 2 3 4 5 6 7 8 9 Ten 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9---------------------------------- ----------------i=7, k=91 2 3 4 5 6 7 8 9 R[0]:9, R[1]:7, R[2]:7, Mid:7,middle:8j=7, a[j]:81 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9--------------------------------------------------i=8, k=91 2 3 4 5 6 7 8 9 R[0]:8, R[1]:8, R[2]:8, Mid:8 , Middle:9j=8, a[j]:91 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10
Algorithm (ii): Quick Sort