- 实现一个函数,给定一个数组,要求使得数组中负数在所有正数的前面
-
实现一个函数,给定一个数组,要求使得数组中负数在前正数在后零在中间
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 //输出数组元素 5 void print(int *arr, int len); 6 //交换两个数 7 void swap(int *left, int *right); 8 //将所有正数排在后面 9 void sort_two(int *arr, int len); 10 //将负数排在前面,0放在中间,整数排在后面 11 void sort_three(int *arr, int len); 12 13 int main() 14 { 15 int arr[11] = {1,0,-2,5,7,8,-1,-5,-9,-7,0}; 16 printf("排序前: "); 17 print(arr,11); 18 19 printf("排序后: "); 20 // sort_two(arr,11); 21 sort_three(arr,11); 22 print(arr,11); 23 24 return 0; 25 } 26 27 //将所有正数排在后面,实质是双色排序问题,类似快排的思想 28 void sort_two(int *arr, int len) 29 { 30 int left = 0, right = len - 1; 31 while(left < right) 32 { 33 //从左往右找到一个正数时跳出循环 34 while(arr[left] <= 0) 35 left++; 36 //从右往左找到一个非正数时跳出循环 37 while(arr[right] > 0) 38 right--; 39 //一定要有 40 if(left < right) 41 swap(arr+left,arr+right); 42 left++; 43 right--; 44 } 45 } 46 47 //实质是三色排序问题 48 void sort_three(int *arr, int len) 49 { 50 int left, curr, right;//三色的工作指针 51 left = 0;//记录负数序列末尾的下一个元素 52 curr = 0;//记录0序列的下一个元素 53 right = len - 1;//记录正数序列前端的前一个元素 54 55 while(curr <= right) 56 { 57 if(arr[curr] == 0)//0 58 curr++; 59 else if(arr[curr] < 0)//负数 60 { 61 swap(arr+curr,arr+left); 62 curr++; 63 left++; 64 } 65 else//正数 66 { 67 swap(arr+curr,arr+right); 68 right--; 69 } 70 } 71 } 72 73 void swap(int *left, int *right) 74 { 75 *left ^= *right; 76 *right ^= *left; 77 *left ^= *right; 78 } 79 80 void print(int *arr, int len) 81 { 82 int i; 83 for(i = 0; i < len; i++) 84 printf("%4d",*(arr+i)); 85 printf(" "); 86 }
运行结果: