zoukankan      html  css  js  c++  java
  • [C][代码实例]整型数组二分排序

    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h>
    #include <string.h>
    
    
    void _qsort(void*, size_t, size_t);
    void vswap(void*, void*, size_t);
    
    int main(void)
    {
    	int int_1[] = {
    		85,9,32,64,12,7,9,51,2,63
    	};
    	size_t len = sizeof(int);
    	/*char int_1[] = {
    		85,9,32,64,12,7,9,51,2,63
    	};
    	size_t len = sizeof(char);*/
    
    
    	size_t count = sizeof(int_1)/len;
    	void *p_1 = malloc(count*len);
    	memcpy(p_1, int_1, count*len);
    
    	_qsort(p_1, count, len);
    	printf("ALL Done-----------------
    ");
    
    	size_t total_len = len * count;
    	int i = 0;
    	for (; i < total_len; ++i)
    	{
    		if(i%len != 0)
    		{
    			continue;
    		}
    		printf("%d,", *((int *)(p_1+i)));
    		//printf("%d
    ", *((char *)(p_1+i)));
    	}
    	printf("
    ");
    
    }
    void _qsort(void *p,  size_t count,  size_t len)
    {
    	if(count == 2)
    	{
    		if( *((int*)(p)) > *((int*)(p+len)) )
    		{
    			vswap(p, p+len, len);
    		}
    	}
    	if(count > 2)
    	{
    		int mid_edge = (count + count%2)/2 - 1;
    		size_t total_len = len * count;
    		void *p_t = malloc(total_len);
    		int i = 0;
    		int index = 0;
    		int l_count = 0;
    		int r_count = 0;
    		for (; i < total_len; ++i)
    		{
    			if(i%len != 0)
    			{
    				continue;
    			}
    			if(i/len == mid_edge)
    			{
    				continue;
    			}
    			if( *((int*)(p+i)) <= *((int*)(p+(mid_edge*len))) )
    			{
    				memcpy(p_t+(index*len), p+i, len);
    				printf("l :%d, val :%d
    ", index, *((int*)(p+i)));
    				index++;
    				l_count++;
    			}
    		}
    		//set mid
    		memcpy(p_t+(index*len), p+(mid_edge*len), len);
    		printf("mid_edge :%d, val :%d
    ", index, *((int*)(p+(mid_edge*len))));
    		index++;
    		//set right
    		i = 0;
    		for (; i < total_len; ++i)
    		{
    			if(i%len != 0)
    			{
    				continue;
    			}
    			if(i/len == mid_edge)
    			{
    				continue;
    			}
    			if( *((int*)(p+i)) > *((int*)(p+(mid_edge*len))) )
    			{
    				memcpy(p_t+(index*len), p+i, len);
    				printf("r :%d, val :%d
    ", index, *((int*)(p+i)));
    				index++;
    				r_count++;
    			}
    		}
    
    		memcpy(p, p_t, total_len);
    		free(p_t);
    		//recursive
    		printf("%d
    ", l_count);
    		printf("%d
    ", r_count);
    		printf("Done-----------------
    ");
    		_qsort(p,  l_count, len);
    		_qsort(p+((l_count+1)*len),  r_count, len);
    	}
    }
    
    
    
    void vswap(void *p_1, void *p_2, size_t len)
    {
    	void *p_t = malloc(len);
    	memcpy(p_t, p_1, len);
    	memcpy(p_1, p_2, len);
    	memcpy(p_2, p_t, len);
    	free(p_t);
    }
    
  • 相关阅读:
    STL的适配器、仿函数学习之一:accumulate和for_each的使用心得
    百度笔试题--------数字拼接,求出最小的那个
    百度面试题----依概率生成
    百度笔试题----C语言版revert
    百度笔度题-----蚂蚁爬杆问题
    Try....Catch......Finally 的执行顺序
    数据库SQL SERVER 2008R2 远程连接配置说明
    C#中的数据库的连接方式分类说明(转载)
    网络通信—udp使用领悟
    (转载)C#网络通信之TCP连接
  • 原文地址:https://www.cnblogs.com/yiyide266/p/8431980.html
Copyright © 2011-2022 走看看