zoukankan      html  css  js  c++  java
  • 双色、三色排序问题

    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("排序前:
    ");
    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 }

     运行结果:



  • 相关阅读:
    设计模式学习--Abstarct Factory
    WPF使用Canvas绘制可变矩形
    离线安装 Android 4.0 SDK
    引用了System.Configuration命名空间,却找不到ConfigurationManager类
    LIBXML2库使用指南2
    Quartz任务调度实践
    FastJson 自定义Serialize、Parser
    maven安装与创建多模块项目
    Zookeeper源码调试环境踩坑记录
    Apache Dubbo时间轮HashedWheelTimer算法的实现原理
  • 原文地址:https://www.cnblogs.com/cpsmile/p/4427920.html
Copyright © 2011-2022 走看看