分享排列一小例(0,1, 2)
大牛们的问题做不来, 也就自娱自乐的看一些简单的小问题哈, 拿来分享一下不是什么复杂的问题,
是一个排列0,1, 2 的问题, 好像和德国国旗问题什么的怪像的( Dutch national flag problem.)
也就是给定一个数组 {0, 1, 1, 0, 1, 2, 1, 2, 0, 0, 0, 1};
然后排好队就行了, {0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2}
直接给程序太生硬,给个连接吧,里面有解释
http://www.csse.monash.edu.au/~lloyd/tildeAlgDS/Sort/Flag/
因为感觉只是要排列三种数,所以没那么复杂了
Time Complexity: O(n)
程序代码:
#include <stdio.h> void swap(int *a, int *b); void sort012(int a[], int arr_size) { int lo = 0; int hi = arr_size - 1; int mid = 0; while( mid <= hi ) { switch ( a[mid] ) { case 0: swap ( &a[lo++], &a[mid++] ); break; case 1: mid++; break; case 2: swap ( &a[mid], &a[hi--]); break; } } } void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } void printArray(int arr[], int arr_size) { int i; for( i = 0; i < arr_size; i++) printf("%d ", arr[i] ); printf("\n"); } int main(void) { int arr[] = {0, 1, 1, 0, 1, 2, 1, 2, 0, 0, 0, 1}; int arr_size = sizeof( arr ) / sizeof( arr[0] ); int i; sort012( arr, arr_size ); printf("array after segregation "); printArray( arr, arr_size ); return 0; }
[ 本帖最后由 madfrogme 于 2012-8-21 12:29 编辑 ]