插入排序、归并排序、快速排序等各类排序

插入排序

 

int insertion_sort(int a[])
{
  int j, t;
  for (int i=2; i<=N; ++i)
  {
    j = i;
    while (j > 1 && a[j] < a[j - 1])
    {
        t = a[j];
        a[j] = a[j-1];
        a[j-1] = t;
        j = j-1; 
    }
  }
}

 

链表相关算法题、编程题、面试题

如何实现单链表逆转,输入为一个头节点,输出一个头节点。

 

ListNote *listReverse(ListNote *head)
{
    ListNote *p, *q, *r;
    p = head;
    q = p->next;
    if (q) r = q->next;
    else r = NULL;
    if (head || head->next)
    {
        while (r)
        {
            q->next = p;
            p = q;
            q = r;
            r = r->next;
        }
        q->next = p;
        head->next = NULL;
    }
    return q;
}

 

如何去除链表中重复的元素,不许使用额外空间?

 

ListNote *removeDupList(ListNote *head)
{
    //q: the current node, p: the running node, r: the previous node
    ListNote *p, *q, *r;
    q = head->next;
    r = head;
    bool flag;
    while (q)
    {
        p = head;
        flag = false;
        while (p != q)
        {
            if (p->data == q->data)
            {
                flag = true;
                break;
            }
            p = p->next;
        }
        if (flag)
        {
            free(r->next);
            r->next = q->next;
        }
        else
        {
            r = r->next;
        }
        q = q->next;
    }
}

 

字符串、数组相关编程题面试题

 

Implement an algorithm to determine if a string has all unique characters What if you can not use additional data structures? 

如何判断字符串中是否有重复的字符?

bool isUniqueChar(string s)
{
    bool h[256]={0};
    for (int i=0; i<=s.size()-1; ++i)
    {
        if (h[s[i]]) return false;
        h[s[i]] = 1;
    }
    return true;
}

 

 

如何将C的字符数组(char *)逆转?

Write code to reverse a C-Style String (C-String means that “abcd” is represented as five characters, including the null character ) 

 

void cStringReverse(char *s)
{
    char *end = s;
    char tmp;
    if (s)
    {
        while (*end) ++end;
        --end;
        while (s < end)
        {
            *s++ = *end--;
        }

    }
}

 

如何将字符数组重复的字符去除?不允许使用额外的存储空间。

Design an algorithm and write code to remove the duplicate characters in a string without using any additional buffer. NOTE: One or two additional variables are fine. An extra copy of the array is not.

 

void removeDuplicateChar(char *s)
{
    char *end = s+1;
    char *p = s+1;
    if (s)
    {
        while (*p)
        {
            char *q = s;
            while (q < p)
            {
                if (*p == *q)
                {
                    break;
                }
                ++q;
            }
            if (p == q)
            {
                *end = *p;
                ++end;
            }
            ++p;
        }
        *end = '\0';
    }
}