TCP库的应用——排序

client.c

#include"my_sort.h"  //my_sort 放在include中,里面包含my_socket.h
#define MY_IP "127.0.0.1"
#define MY_PORT 6666
#define SER_IP "127.0.0.1"
#define SER_PORT 8888
int main()
{
srand(getpid());
int arr[20];
int fd_client;
int len;
my_socket(&fd_client,MY_TCP,MY_IP,MY_PORT);//绑定自己的
arr_init(arr,20);//用my_sort.c的函数初始化
printf("before:\n");
arr_show(arr,20);
printf("connecting...\n");
SA server_addr;
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(SER_PORT);
server_addr.sin_addr.s_addr=inet_addr(SER_IP);
my_connect(fd_client,(pSA)&server_addr,sizeof(SA));
printf("connect success!\n");
my_send(&len,fd_client,arr,80);//将数组发送过去
my_recv(&len,fd_client,arr,80);//接收处理好的数组
printf("after:\n");
arr_show(arr,20);
return 0;
}

server.c

#include"my_sort.h"
#define IP "127.0.0.1"
#define PORT 8888
int main()
{
int fd_server,fd_client;
int arr[20];
int len;
my_socket(&fd_server,MY_TCP,IP,PORT);
my_listen(fd_server,10);
my_accept(&fd_client,fd_server,NULL,NULL);
printf("a client on!\n");
my_recv(&len,fd_client,arr,80);//接收客户端的数据
printf("before:\n");
arr_show(arr,20);
quick_sort(arr,20);//调用my_soet.c的快速排序函数
printf("after:\n");
arr_show(arr,20);
my_send(&len,fd_client,arr,80);//处理好后发送给客户端
return 0;
}

my_sort.c

#include "my_sort.h"
void arr_init(int* arr, int len)
{
int index ;
for(index = 0 ; index < len; index ++)
{
arr[index] = rand() % 1000 ;
}
}

void arr_show(int* arr, int len)
{
int index ;
for(index = 0 ; index < len; index ++)
{
printf("%4d", arr[index]);
}
printf("\n");
}

插入排序
void insert_sort(int* arr, int len)
{
int pos , index ;
int key ;
for(pos = 1 ; pos < len; pos ++)
{
key = arr[pos] ;
for(index = pos - 1 ; index >= 0; index --)
{
if(arr[index] < key)
{
break ;
}else
{
arr[index + 1] = arr[index] ;
}
}
arr[index + 1] = key ;
}
}
static void swap(int* left, int* right)
{
int tmp = *left ;
*left = *right ;
*right = tmp ;
}

//快速排序
void quik_sort(int* arr, int len)
{
if(len < 10)
{
int pos , index ;
int key ;
for(pos = 1 ; pos < len; pos ++)
{
key = arr[pos] ;
for(index = pos - 1 ; index >= 0; index --)
{
if(arr[index] < key)
{
break ;
}else
{
arr[index + 1] = arr[index] ;
}
}
arr[index + 1] = key ;
}

}else
{
int k ;
k = partion(arr, len);//0 - k-1(< key) k(key) (k+ 1 - len -1) (>= key)
quik_sort(arr, k);
quik_sort(arr + k + 1, len - k - 1);
}
}

方法1
int partion(int* arr, int len)
{
int key = arr[0] ;
int low, high ;
low = 0 ;
high = len - 1 ;
while(low < high)
{
while(low < high && arr[high] >= key )
{
high -- ;
}
if(low >= high)
{
break ;
}else
{
swap(&arr[low], &arr[high]);
}
while(low < high && arr[low] < key)
{
low ++ ;
}
if(low < high)
{
swap(&arr[low], &arr[high]);
}

}
return low ;
}

方法2 快慢指针

#include "my_sort.h"
int partion2(int *arr,int len)
{
int fast,last,key;
last=0;
fast=1;
key=arr[0];
for(;fast<len;fast++)
{
if(arr[fast]<key)
{
swap(&arr[last+1],&arr[fast]);
last++;
}
}
swap(&arr[0],&arr[last]);
return last;
}

上面的三个文件都包含#include "my_sort.h"

我们来看看my_sort.h

#include"my_socket.h"
void arr_init(int* arr,int len);
void arr_show(int* arr,int len);
void insert_sort(int* arr,int len);
static void swap(int* left,int* right);
void quick_sort(int* arr,int len);
int partion(int* arr,int len);

原来它里面已经包含my_socket.h

那就追踪看看my_socket.h

#ifndef __MY_SOCKET_H__
#define __MY_SOCKET_H__

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define IN
#define OUT
#define IN_OUT
#define MY_TCP 1
#define MY_UDP 2
typedef struct sockaddr* pSA ;
typedef struct sockaddr_in SA ;
#define MY_ASSERT(flag,msg) ( (flag) ? NULL : ( fprintf(stdout,msg), exit(EXIT_FAILURE) ) )   // NULL代表什么也不做

void my_socket(OUT int *local_sfd, int protocal, char *local_ip, int local_port);
void my_listen(int local_sfd, int backlog);
void my_accept(OUT int *peer_sfd, int local_sfd, OUT pSA peer_addr, IN_OUT int *addr_len );
void my_connect(int local_sfd, pSA peer_addr, int addr_len);
void my_recv(OUT int *recv_len, int peer_sfd, IN_OUT void *base, int len);
void my_send(OUT int *send_len, int peer_sfd, void *base, int len);
void my_recvfrom(OUT int *recvfrom_len, int peer_sfd, IN_OUT void *base, int len, OUT pSA peer_addr, IN_OUT int *addr_len);
void my_sendto(OUT int *sendto_len, int peer_sfd, OUT void *base, int len,  pSA peer_addr, int addr_len);
void my_close(int sfd);
#endif

 //编译gcc -o c client.c my_sort.c -l my_socket -I /tmp/include
gcc -o s server.c my_sort.c -l my_socket -I /tmp/include

//运行结果如下

 
时间: 2024-10-28 16:58:54

TCP库的应用——排序的相关文章

STL笔记(6)标准库:标准库中的排序算法

STL笔记(6)标准库:标准库中的排序算法 标准库:标准库中的排序算法The Standard Librarian: Sorting in the Standard Library Matthew Austern http://www.cuj.com/experts/1908/austern.htm?topic=experts 用泛型算法进行排序    C++标准24章有一个小节叫“Sorting and related operations”.它包含了很多对已序区间进行的操作,和三个排序用泛型

sort在STL库中是排序函数

sort在STL库中是排序函数,有时冒泡.选择等O(N^2)算法会超时时,我们可以使用STL中的快速排序O(N log N)完成排序 sort在<algorithm>库里面,原型如下: 1 2 3 4 template <class RandomAccessIterator>  void sort ( RandomAccessIterator first, RandomAccessIterator last ); template <class RandomAccessIte

分享一个Delphi跨平台Http库的封装,一个Delphi跨平台TCP库的封装

{ 单元名:跨平台的TCP客户端库封装 作者:5bug 网站:http://www.5bug.wang } unit uCPTcpClient; interface uses System.Classes, System.SysUtils, IdTCPClient, IdGlobal; type TOnRevDataEvent = procedure(const pData: Pointer; const pSize: Cardinal) of object; TCPTcpClient = cl

计蒜客-题库-三值排序

题目 排序是一种很频繁的计算任务.一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌排序的时候.在这个任务中可能的值只有三种1,2和3.我们用交换的方法把他排成升序的. 写一个程序计算出,计算出的一个包括1.2.3三种值的数字序列,排成升序所需的最少交换次数. 输入第1行为类别的数量N(1≤N≤1000) 输入第2行到第N+1行,每行包括一个数字(1或2或3). 输出包含一行,为排成升序所需的最少交换次数. 样例输入 9 2 2 1 3 3 3 2 3 1 样例输出 4 思路 对于排好序的1.

Mysql建库,字符集和排序规则

一般对于中文使用都是用utf8字符集和utf8_general_ci 的排序规则 为什么要选用这两种方式可以参考~~~ 哪篇帖子~下次找到贴上来 mysql>CREATE DATABASE IF NOT EXISTS my_db default charset utf8 COLLATE utf8_general_ci; #注意后面这句话 "COLLATE utf8_general_ci",大致意思是在排序时根据utf8变码格式来排序 #那么在这个数据库下创建的所有数据表的默认字符

Pandas库DataFrame的排序

df1为dataframe结构的测试数据: df1数据是从test.xlsx文档中读取的,使用示例代码如下: # -*- coding:utf-8 -*- import tushare as ts import pandas as pd df = pd.read_excel('test.xlsx') df1 = df.head(10) #dataframe按索引升序排列,默认即是升序 #print df1.sort_index() #dataframe按索引降序排列 #print df1.sor

c++标准库里的sort()排序函数

Sort()函数是c++一种排序方法之一,学会了这种方法也打消我学习c++以来使用的冒泡排序和选择排序所带来的执行效率不高的问题!因为它使用的排序方法是类似于快排的方法,时间复杂度为n*log2(n),执行效率较高!一,sort()排序函数的使用方法I)Sort函数包含在头文件为#include<algorithm>的c++标准库中,调用标准库里的排序方法可以不必知道其内部是如何实现的,只要出现我们想要的结果即可!II)Sort函数有三个参数:Sort(start,end,排序方法)(1)第一

常用的python库(不断更新)

来源:http://www.cnblogs.com/yd1227/archive/2010/11/15/1877467.html 排序不分优先级. 1.os   和操作系统有关 2.time    与时间有关 3.pcap    抓包 4.dpkt   解包和组包 5.pymssql   进行mssql数据库操作 6.cProfile    自己debug脚本性能时用的,可以精确快速计算运行时间 7.urllib2    最早接触的库之一,跟HTTP有关 8.httplib   与HTTP有关

LINUX TCP套接字详细配置

提高服务器的负载能力,是一个永恒的话题.在一台服务器CPU和内存资源额定有限的情况下,最大的压榨服务器的性能,是最终的目的.要提高 Linux系统下的负载能力,可以先启用Apache的Worker模式,来提高单位时间内的并发量.但是即使这么做了,当网站发展起来之后,连接数过多 的问题就会日益明显.在节省成本的情况下,可以考虑修改Linux的内核TCP/IP参数,来最大的压榨服务器的性能.当然,如果通过修改内核参数也无法 解决的负载问题,也只能考虑升级服务器了,这是硬件所限,没有办法的事. Lin