1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| #include <stdio.h>
typedef struct _Range { int start, end; } Range; Range new_Range(int s, int e) { Range r; r.start = s; r.end = e; return r; } void swap(int *x, int *y) { int t = *x; *x = *y; *y = t; } void quick_sort(int arr[], const int len) { if (len <= 0) return; Range r[len]; int p = 0; r[p++] = new_Range(0, len - 1); while (p) { Range range = r[--p]; if (range.start >= range.end) continue; int mid = arr[(range.start + range.end) / 2]; int left = range.start, right = range.end; do { while (arr[left] < mid) ++left; while (arr[right] > mid) --right;
if (left <= right) { swap(&arr[left], &arr[right]); left++; right--; } } while (left <= right);
if (range.start < right) r[p++] = new_Range(range.start, right); if (range.end > left) r[p++] = new_Range(left, range.end); } }
int main(int argc, int argv[]) { int a[10], i; printf("Before sorting:"); for (i = 0; i < 10; i++) { scanf("%d", &a[i]); } quick_sort(a, 10); printf("After sorting:"); for (i = 0; i < 10; i++) printf("%d\t", a[i]); return 0; }
|