`

(第三章 1)通用数组(void**)的归并排序

 
阅读更多

     我简化了书上的实现,每个数组元素是void*类型,两个void*元素的大小比较通过调用者提供的回调函数typedef int (*compare_fun)(void* a, void* b);实现

 

泣血的总结:

 

        1. 减号“-”的优先级

>

  按位右移“>>”的优先级


int len=3;

printf("%d\n",len);

printf("%d\n",len>>1);

printf("%d\n",len>>1-1);

printf("%d\n",(len>>1)-1);


2. 数组越界操作,free()时运行时报错

如果数组在使用时候越界(例如,读写arr[k]内容,而k大于等于arr长度)。当使用完数组arr并释放它时,会(运行时)报错:

*** glibc detected *** : free(): invalid next size (fast)


3. 学会释放int** 或者 void**

int length=...;

...

void** arr_tmp=(void**)malloc(length*sizeof(void*)); //#include <stdlib.h>

...

free(arr_tmp);

arr_tmp=NULL;                                                                                                                                                                             

 

 

sort.h

 

#ifndef SORT_H
#define SORT_H

typedef enum _Ret{
	RET_OK,
	RET_INVALID_PARAM,
	RET_FAIL
}Ret;

typedef int (*compare_fun)(void* a, void* b);
Ret merge_sort(void** arr, int length, compare_fun compare);

#endif
 

 

sort.c

 

#include <stdlib.h>
#include "sort.h"

//int (*compare_fun)(void* a, void* b);
Ret merge_sort(void** arr, int length, compare_fun compare){

	if(length==1 || length==0)
		return RET_OK;	

	//merge_sort	-----divide
	merge_sort(arr, (int)(length>>1), compare);
	merge_sort(arr+(int)(length>>1), length-(int)(length>>1), compare);
	
	//merge		-----conquer
	void** arr_tmp=(void**)malloc(length*sizeof(void*));	//#include <stdlib.h>

	int i=0,j=length>>1,k=0;

	while(i<=(int)(length>>1)-1 && j<=(length-1)){
		if(compare((void*)arr[i],(void*)arr[j])<0){
			arr_tmp[k++]=arr[i++];
		}else{
			arr_tmp[k++]=arr[j++];
		}
	}

	while(i<=(int)(length>>1)-1){
		arr_tmp[k++]=arr[i++];
	}


	while(j<=length-1){
		arr_tmp[k++]=arr[j++];
	}


	for(i=0;i<length;i++){
		arr[i]=arr_tmp[i];
	}


	free(arr_tmp);
	arr_tmp=NULL;

	return RET_OK;
}
 

调用者程序 test.c

 

#include <stdio.h>
#include <stdlib.h>
#include "sort.h"

//C语言中void*的长度和int的长度相等吗?如果这里换成double类型呢?
int compare(void* a, void* b){
	return (int)a-(int)b;
}

void print(int* arr,int length){
	int i;
	for(i=0;i<length;i++){
		printf("%d\t",arr[i]);
	}
	printf("\n");
}

int main(void){
	int arr[]={5,3,4,2,6,3,1};

	print(arr,7);
	merge_sort((void**)arr,7,compare);
	print(arr,7);

	return 0;
}
 

 

 

 

 

 

分享到:
评论

相关推荐

    动态数组实现(所有代码均使用C语言回调函数实现及存储数据均使用void*、void**实现)

    rar文件包含:Vector.h、Vector.c、...存储数据使用void*、void**,其中包括结构体数据结构。主要功能有初始化动态数组、释放动态数组、尾插法、删除指定下标、更新指定下标数据、打印数据、获取数据对应的指定下标等。

    二维数组排序

    // 二维数组冒泡排序 public static void main(String[] args) { int i=0, j=0, temp = 0; int[][] nums1 = { { 34, 1, 22, 5 }, { 28, 98, 15, 32 }, { 33, -5, 17, 41 } }; int rows = nums1.length; //二维...

    MySort.ts TS通用排序方法

    * @param field 排序字段 值类型传null 单字段传string 多字段传数组[["field1", SortType], ["field2", SortType]] 可传属性名 方法名 * @param sortType 排序类型 SortType枚举 * @returns * 值排序示例:...

    双链表实现(所有代码均使用C语言回调函数实现及存储数据均使用void*、void**实现)

    rar文件包含:DoubleList.h、DoubleList.c、main.c...存储数据使用void*、void**,其中包括结构体数据结构。主要功能有初始化双链表、释放双链表、尾插法、任意插入法、任意删除法、打印数据(从左至右、从右至左)等。

    冒泡排序 算法(冒泡,选择,插入,数组排序)

    算法(冒泡,选择,插入,数组排序) package Teacher; import java.io.*; import java.util.Scanner; public class Tset { public static void main(String args[]) throws IOException { // 需要排序的数组,...

    插入排序 冒泡法排序 快速排序 直接选择排序 堆排序 归并排序 希尔排序 7种排序算法及时间比较

    void paixucaidan() { int i; SeqList R; input_int(R); printf("\t******** Select **********\n"); printf("\t1: 插入排序\n"); printf("\t2: 冒泡法排序\n"); printf("\t3: 快速排序\n"); printf("\t4: ...

    7种常用排序算法实现(C++)(冒泡排序、选择排序、直接插入排序、希尔排序、堆排序、归并排序以及快速排序)

    本文件是7种常用排序算法的实现(C++),包括冒泡排序、选择排序、直接插入排序、希尔排序、堆排序、归并排序以及快速排序。代码详细有注释且有测试用例。

    SeqList.cpp

    void *是特殊的指针 所有类型指针都可以付给void *;但是void *类型指针付给其他指针类型需要强制类型转换。 invalid conversion from `void*' to `SeqList*' 说明你把void *指针付给SeqList*类型的指针了,是不是L=...

    用c实现的快排、插入、希尔、堆、冒泡、选择、归并排序

    void init(sqlist void bubble_sort(sqlist *l); //冒泡 void select_sort(sqlist *l);...//递归调用 二路归并排序 void mer_loop(sqlist *l); //封装循环版本的归并排序 void mer(sqlist *l, int gap);//循环版本

    使用java操作数组排序

    * 插入排序方法,对float数组从小到大的排序 */ public void insertSortAsc(float arr[]) { for (int m = 1; m ; m++) { float insertVal = arr[m]; int index = m - 1; for (; index &gt;= 0; index--...

    C语言分治法实现归并排序

    本文实例为大家分享了C语言实现归并排序的具体代码,供大家参考,具体内容如下 归并排序的基本思想: 将两个及其以上的有序表合并为一张有序表,把待排序序列通过分治法分为若干个有序子序列,然后每两个子序列合并...

    2440三星测试程序

    (void *)User_Test, "User Test ", (void *)Manual_Register_Set,"Manual Reg. Set ", //Memory (void *)Test_PD6710, "PCMCIA test ", (void *)Test_ISram, "Stepping stone ", //(void *)Test_WaitPin, ...

    快速排序算法

    快速排序算法(C语言版) #include #include "type.h" #define Q_SIZE 10 /************************************* 模块内部数组或变量定义 **************************************/ static UINT8 q_array[Q_...

    归并排序&&快速排序c#源码

    //归并排序 public void MergeSort(int low, int high, int[] a) { int mid, i, j, k; int[] b = new int[high+1]; if (low &gt;= high) { return; } mid = (low + high) / 2; MergeSort(low,mid,a); ...

    归并排序 算法练习

    算法练习,仅供参考 用递归实现的一个归并算法 void Merge(int *A,int p,int q,int r)实现对已排序的两部分合并 void Merge_sort(int *A,int p,int r) 调用上述函数实现排序

    关于C++中void*的小作用浅析

    本文主要给大家分享了关于C++中void*的一些你可能不了解的小作用,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 先来看一段代码: #include #include using namespace std; void o(int* x...

    数据结构中关于归并排序代码

    归并排序源代码: #include #include using namespace std; void Merge(int array[], int p, int q, int r) { int* temp = new int [r-p+1]; //申请空间,使其大小为两个已经排序序列之和,该空间用来存放...

    合并排序算法——merge sort

    void init(int A[],int p,int r);//初始化数组 void print_A(int A[],int p,int r);//打印数组元素 void merge(int A[],int p,int q,int r);//合并排序算法 /************合并排序算法的实现******************/ ...

    C++ 先对数组排序,在进行折半查找

    第三部:输入一个数,在后在排好序的数中进行折半查找,判断该数的位置 实现代码如下: 方法一: 选择排序法+循环折半查找法 代码如下:#include&lt;iostream&gt;using namespace std;int main(){ int a[15]; int n,i; ...

    解决error LNK2005 void __cdecl operator delete(void

    解决error LNK2005 void __cdecl operator delete(void

Global site tag (gtag.js) - Google Analytics