读书人

惯用排序算法

发布时间: 2012-09-05 15:19:35 作者: rapoo

常用排序算法

1. 插入排序:

?

#include "main.h"void insertSort(int *data, int length){    int pos, i , temp;    for (pos = 1; pos < length; pos++)    {        temp = data[pos];        for (i = pos - 1; i >= 0; i--)        {            if (temp < data[i])            {                data[i + 1] = data[i];                if (0 == i)                {                    data[0] = temp;                    break;                }            }            else            {                data[i + 1] = temp;                break;            }        }    }}

?2. 选择排序:

?

#include "main.h"void selectSort(int *data, int length){    int max, pos, i;    for (pos = length - 1; pos > 0; pos--)    {        max = 0;        for (i = 1; i <= pos; i++)        {            if (data[max] < data[i])            {                max = i;            }        }        if (max != pos)        {            swap(data, max, pos);        }    }}
?

3. 冒泡排序:

?

#include "main.h"void popSort(int *data, int length){    int pos, i;    for (pos = length - 1; pos >= 1; pos--)    {        for (i = 0; i < pos; i++)        {            if (data[i] > data[i + 1])            {                swap (data, i, i + 1);            }        }    }}
?

4. 快速排序:

?

?

#include "main.h"/**  *  Partition of the quickSort  */int partition(int *data, int start, int end){    int i = start + 1, j = end;    if (start >= end)    {        return start;    }    while (1)    {        while (i <= j && data[start] >= data[i])        {            i++;        }        while (i <= j && data[start] < data[j])        {            j--;        }        if (i < j)        {            swap(data, i, j);        }        else        {            swap(data, start, j);            return j;        }    }}void quickSort(int *data, int start, int end){    int pos;        if (start >= end)    {        return;    }    pos = partition(data, start, end);    quickSort(data, start, pos - 1);    quickSort(data, pos + 1, end);}
?

?

5. 归并排序:

?

#include "main.h"void merge(int *data, int start, int middle, int end){    int i = start, j = middle + 1;    int pos = 0;    int *temp = NULL;        if (start >= end)    {        return;    }    temp = (int *)malloc((end - start + 1) * sizeof(int));    while (i <= middle && j <= end)    {        temp[pos++] = data[i] <= data[j] ? data[i++] : data[j++];    }    while (i <= middle)    {        temp[pos++] = data[i++];    }    while (j <= end)    {        temp[pos++] = data[j++];    }    pos = 0;    while (pos < end - start + 1)    {        data[start + pos] = temp[pos++];    }    free(temp);}void mergeSort(int *data, int length){    int i, step;    for (step = 1; step < length; step *= 2)    {        for (i = 0; i + step < length; i += 2 * step)        {            (i + 2 * step - 1 < length) ?                 merge(data, i, i + step - 1, i + 2 * step - 1) : merge(data, i, i + step - 1, length - 1);        }    }}
?

6. 堆排序:

?

#include "main.h"void adjust(int *data, int pos, int length){    int parent = pos, child = 2 * parent + 1;    while (child < length)    {        if (child + 1 < length && data[child + 1] > data[child])        {            child++;        }        if (data[parent] < data[child])        {            swap(data, parent, child);            parent = child;            child = 2 * parent + 1;        }        else        {            break;        }    }}void createHeap(int *data, int length){    int pos;    for (pos = (length - 2) / 2; pos >= 0; pos--)    {        adjust(data, pos, length);    }}void heapSort(int *data, int length){    int pos;    createHeap(data, length);    for (pos = length - 1; pos >= 0; pos--)    {        swap(data, pos, 0);        adjust(data, 0, pos);    }}void heapSortNoWrap(int *data, int length){    int start, end, child, parent, temp;    end = length - 1;    start = (end - 1) / 2;    while (1)    {        if (0 <= start)        {            temp = data[start--];        }        else        {            if (0 == end)            {                return;            }            else            {                temp = data[end];                data[end--] = data[0];            }        }        parent = start + 1;        child = 2 * parent + 1;        while (child <= end)        {            if (child + 1 <= end && data[child + 1] > data[child])            {                child++;            }            if (temp < data[child])            {                data[parent] = data[child];                parent = child;                child = 2 * parent + 1;            }            else            {                break;            }        }         data[parent] = temp;    }}
?

?

读书人网 >编程

热点推荐