常用算法总结

反转数组/字符串

void reverseArray( int * a, int len )
{
    for( int i = 0; i < len/2; i++ )
    {
        int tmp = a[i];
        a[i] = a[len-1-i];
        a[len-1-i] = tmp;
    }
}

反转单向链表

方法一:双指针

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* reverseList(struct ListNode* head){

    if( (head == NULL) || (head->next == NULL) )
    {
        return head;
    }

    struct ListNode *prev, *cur, *next;

    prev = NULL;

    cur = head;

    while( cur )
    {
        next = cur->next; //保存下一个结点
        cur->next = prev;
        
        prev = cur; //移动指针直到cur指向null,prve指向最后一个
        cur = next;
    }

    
    return prev;

}

方法二:递归

struct ListNode* reverseList(struct ListNode* head){

    if(head == NULL || head->next == NULL )
    {
        return head;
    }

    struct ListNode* ret = reverseList(head->next);

    head->next->next = head;
    head->next = NULL;

    return ret;

}

快速排序算法

void swap( int* arr, int i, int j )
{
    int tmp;
    tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
}

void QuickSort( int* arr, int l, int r )
{
    int base;
    base = l;
    int i = l;
    int j = r;
    
    if( i >= j) //递归出口
        return;

    while( i < j)
    {
        while( i < j && arr[j] >= arr[base] ) j--; //找到比arr[base]小的
        while( i < j && arr[i] <= arr[base] ) i++; //找到比arr[base]大的
        
        if( i < j )
        {
            swap(arr, i, j);
        }
    }
    
    swap(arr, base, i); //交换base和中间元素
    QuickSort(arr, l, i-1);
    QuickSort(arr, i+1, r);
}

归并排序算法

void merge_sort(int a[], int s[], int left,int right){
	if(left<right){
		int mid = (left + right) / 2;//从中间截开
		merge_sort(a, s, left, mid);//排序左边 [left, mid ]
		merge_sort(a, s, mid + 1, right);//排序右边[mid+1, right]
		merge(a, s,left, right, mid);//合并左右
	}
}
void merge(int a[],int s[], int left,int right,int mid) {
	
	int i = left, j = mid + 1;//两个变量分别指向左边和右边两组数的第一个数
	int sor = left;
	while (i <= mid && j <= right) {
		if (a[i] < a[j]) {//归并的过程
			s[sor++] = a[i++];
		}
		else {
			s[sor++] = a[j++];
		}
	}
	while (i <= mid) s[sor++] = a[i++];//当一组数已经全部排进去之后,再将另外一组数的全部数字都排进去
	while (j <= right)  s[sor++] = a[j++];
	sor = left;
	while (sor <= right) {//把排好序的新数组全部放回原数组里
		a[sor] = s[sor];
		sor++;
	}
}

二叉树的前中后序遍历

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 * };
 */


void PreOrder( struct TreeNode * root )//前序遍历
{
    if( root == NULL )
    return;

        XXX;               //1. 对根节点做操作
    PreOrder(root->left);  //2. 左子树
    PreOrder(root->right); //3. 右子树
    

}


void InOrder( struct TreeNode * root )//前序遍历
{
    if( root == NULL )
    return;

    InOrder(root->left);    //1. 左子树
               XXX;         //2. 对根节点做操作
    InOrder(root->right);   //3. 右子树
    
}


void PostOrder( struct TreeNode * root )//后序遍历
{
    if( root == NULL )
    return;

    PostOrder(root->left);  //1.左子树
    PostOrder(root->right); //2.右子树
               XXX;         //3.对根节点做操作

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值