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 }

     运行结果:



  • 相关阅读:
    分析记录:文件不落地的恶意脚本攻击——傀儡进程盗号
    恶意宏学习备忘04——恶意宏调试记录
    恶意宏学习备忘03——手动清除文档宏
    恶意宏学习备忘02
    恶意宏学习备忘
    IRP小结 0x01 IRP & IO_STACK_LOCATION(结合WRK理解)
    文件防删除保护(miniifiter)
    初识虚拟化
    HYPERSPACE
    几个常用内核函数(《Windows内核情景分析》)
  • 原文地址:https://www.cnblogs.com/cpsmile/p/4427920.html
Copyright © 2011-2022 走看看