《c與指標》第13章課後習題4
阿新 • • 發佈:2018-11-05
#include <stdio.h> #include <stdlib.h> #include <string.h> int arry[4] = { 6, 2, 3, 1 }; int cmp ( void * a, void * b) { return ( *(int*)a - *(int*)b ); } /* 比如6,2,3,1 開始先以6為最小的數,在6之後開始遍歷,如果遇到比6小的數就替換6的位置(1,6,3,2) 接下來以6為基準,遍歷6以後的數,遇到比6小的數,就替換6的位置(1,2,6,3),然後如此loop下去*/ void sort(void *base,unsigned int n,unsigned int width,int (*comp)(void *a,void *b)) { char *p=(char *)base;//基地址 char *te=(char *)malloc(width);//中間變數 char *ptr; char *pn; const char *cp=p+(n-1)*width;//陣列最後一個元素 for (; p<cp; p+=width ) { for (pn=p+width; pn<=cp; pn+=width) { ptr = p;//記錄陣列中最小的數 printf( "test:%d\n", (*comp)(ptr,pn));// if ( (*comp)(ptr,pn)>0 ) { ptr=pn; } if (ptr!=p) { memcpy(te,p,width); memmove(p,ptr,width); memmove(ptr,te,width); } } } free(te); } void main() { int i; sort( arry, 4, sizeof( arry[1]), cmp); for( i = 0; i < 4; i++) printf( "%d\n", arry[i] ); getchar(); }