码迷,mamicode.com
首页 > 编程语言 > 详细

双色、三色排序问题

时间:2015-04-15 12:57:41      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:

  1. 实现一个函数,给定一个数组,要求使得数组中负数在所有正数的前面
  2. 实现一个函数,给定一个数组,要求使得数组中负数在前正数在后零在中间

 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("排序前:\n");
17     print(arr,11);
18 
19     printf("排序后:\n");
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("\n");
86 }

 运行结果:

技术分享

技术分享



 

双色、三色排序问题

标签:

原文地址:http://www.cnblogs.com/cpsmile/p/4427920.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!