天天看点

代码备份

堆排序

写得很烂,也可能是错的,自己看看就好了……

typedef int debug_int [50];

debug_int* p;

void print(int a[], int length)

{

for (int i = 0; i< length; ++i)

{

cout<<a[i]<<" ";

}

cout<<endl;

}

void heapadjust(int a[], int s, int length)

int temp;

int child_pos;

for (int i = s; 2*i+1 < length ; i = child_pos)

child_pos = 2*i +1;

if (child_pos != length - 1 && a[child_pos] < a[child_pos +1] )

{

++child_pos;

}

if (a[i] < a[child_pos])

temp = a[i];

a[i] = a[child_pos];

a[child_pos] = temp;

else

break;

void heapsort(int a[], int length)

for (int i = length/2 - 1 ; i >= 0 ; --i)

heapadjust(a, i, length);

print(a, length);

cout<<"************************"<<endl;

for (int i = length - 1; i>0; --i)

swap(a[i], a[0]);

heapadjust(a, 0, i);

void main()

int a[50];

p = &a;

int i = 0;

while(cin>>a[i])

++i;

heapsort(a, i);

cout<<"------------------"<<endl;

print(a, i);

快速排序

template<class T>

size_t Partition(T a[], int low, int high)

T pivotkey = a[low];

int old_high = high;

int old_low = low;

while(low < high)

while(low < high && a[high] >= pivotkey)

--high;

a[low] = a[high];

//swap(a[low], a[high]);

while(low < high && a[low] <= pivotkey)

++low;

a[high] = a[low];

//if (low < high)

//{

// swap(a[low], a[high]);

//}

if (low <= old_high)

a[low] = pivotkey;

return low;

void Qsort(T a[], int low, int high)

int location;

if (low < high)

location = Partition(a, low, high);

Qsort(a, low, location - 1);

Qsort(a, location + 1, high);

atoi

long __cdecl atol(

const char *nptr

)

{

int c; /* current char */

long total; /* current total */

int sign; /* if '- ', then negative, otherwise positive */

/* skip whitespace */

while ( isspace((int)(unsigned char)*nptr) )

++nptr;

c = (int)(unsigned char)*nptr++;

sign = c; /* save sign indication */

if (c == '- ' || c == '+ ')

c = (int)(unsigned char)*nptr++; /* skip sign */

total = 0;

while (isdigit(c)) {

total = 10 * total + (c - '0 '); /* accumulate digit */

c = (int)(unsigned char)*nptr++; /* get next char */

}

if (sign == '- ')

return -total;

else

return total; /* return result, negated if necessary */

}

int __cdecl atoi(

const char *nptr

)

return (int)atol(nptr);

二分查找

int binaryfind(int a[], int n, int val)

int low = 0;

int high = n - 1;

if (n <= 0)

return -1;

while(low <= high)

int mid = low + (high - low)/2;

if (a[mid] == val)

return mid;

else if (a[mid] > val)

high = mid -1;

low = mid + 1;

return -1;

链表反向和合并

//定义数据结构

struct Node

{

Node(int i):data(i),next(0){}

int data;

Node* next;

};

void ListReverse(Node* &p)

Node* oldhead = p->next;

Node* newhead = p;

if (p == NULL)

return;

newhead->next = NULL;

while(oldhead)

Node* temp = oldhead->next;

oldhead->next = newhead;

newhead = oldhead;

oldhead = temp;

p = newhead;

Node* ListMerge(Node* p1, Node* p2)

if (p1 == NULL)

return p2;

if (p2 == NULL)

return p1;

Node* head = p1;

p1 = p1->next;

Node* cur = head;

while(p1 && p2)

if (p1->data <= p2->data)

head->next = p1;

head = head->next;

p1 = p1->next;

head->next = p2;

p2 = p2->next;

if (p1 != NULL)

head->next = p1;

if (p2 != NULL)

head->next = p2;

return cur;

判断大小端机器

int isSmallEndian()

static union u{

char c[2];

short i;

}U = {0x0001};

return U.c[0];

变参函数

void printInt(int n, ...)

va_list ap;

va_start(ap, n);

for (int i = 0; i < n; ++i)

int temp = va_arg(ap, int);

cout<<temp<<' ';

va_end(ap);

strstr

char* strstr(const char *str1, const char *str2)

char *s1, *s2;

_ASSERT(str1 && str2);

//空字符串是任何字符串的子串

if ('/0' == *str2){

return (char*)str1;

while (*str1)

s1 = (char*)str1;

s2 = (char*)str2;

while ((*s1 == *s2) && *s1 && *s2){

s1++; s2++;

//匹配成功

if ('/0' == *s2){

return (char*)str1;

}

str1++;

return NULL;

strcpy

char * strcpy (char * dst, char * src)

char * cp = dst;

while( *cp++ = *src++ )

; /* Copy src over dst */

return( dst );

strcat

char * strcat (char * dst, char * src)

while( *cp )

++cp; /* Find end of dst */

; /* Copy src to end of dst */

strcmp

int strcmp2 (const char *src, const char *dst)

int ret = 0 ;

while(!(ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)

++src;

++dst;

if ( ret < 0 )

ret = -1 ;

else if ( ret > 0 )

ret = 1 ;

return( ret );

统计二进制位为1的个数

//算法:统计x转化为2进制的位中为1的个数

//来源:网上

int

func(int x)

int countx = 0;

while(x)

{

countx ++;

x = x&(x-1);

}

return countx;

int func(int x)

for(int i=0;i<32;i++){

if((x>>i)&1)

countx ++;

}

继续阅读