现在的位置: 首页 > 综合 > 正文

算法导论之插入排序,选择排序,归并排序,冒泡排序,希尔排序,堆排序,快速排序的c语言实现

2013年07月24日 ⁄ 综合 ⁄ 共 2603字 ⁄ 字号 评论关闭

另外还有基数排序,计数排序,桶排序等,暂时没有时间看。先把上面这些的c语言代码写一下,并且简略提一下原理。

插入排序:对于未排序的数据,在已排序数据中从后向前扫描,找到相应位置插入.(第一个元素当做已排序)扫描过程中需要反复把已排序的元素逐步向后移动,为新元素提供插入空间。

 1 void insertion_sort(int *a, int len)        //调用insertion_sort(a, len)
 2 {
 3     int i, j, key;                            //key是待排序数
 4     for (i = 1; i < len; ++i)
 5     {
 6         key = a[i];
 7         j = i - 1;
 8         while (j >= 0 && key < a[j])        //逐个后移
 9         {
10             a[j+1] = a[j];
11             --j;
12         }
13         a[j+1] = key;
14     }
15 }

选择排序:首先找到数组a中最小元素与a【1】交换,再次小元素与a【2】交换,对a中前n-1个元素继续此过程。

void selection_sort(int *a, int len)        //调用selection_sort(a, len)
{
    int i, j, k, t;
    for (i = 0; i < len - 1; ++i)
    {
        k = i;
        for (j = i + 1; j < len; ++j)
            if (a[k] > a[j])
                k = j;
        t = a[i];
        a[i] = a[k];
        a[k] = t;
    }
}

归并排序:

 1 void merge(int *a, int *temp_array, int lpos, int rpos, int right_end)
 2 {
 3     int i, left_end, num_element, tmp_pos;
 4     left_end = rpos - 1;    
 5     tmp_pos = lpos;
 6     num_element = right_end - lpos + 1;
 7     while (lpos <= left_end && rpos <= right_end)
 8     {
 9         if (a[lpos] <= a[rpos])
10             temp_array[tmp_pos++] = a[lpos++];
11         else
12             temp_array[tmp_pos++] = a[lpos++];
13     }
14     while (lpos <= left_end)
15         temp_array[tmp_pos++] = a[lpos++];
16     while (rpos <= right_end)
17         temp_array[tmp_pos++] = a[rpos++];
18     for (i = 0; i < num_element; ++i, right_end--)
19         a[right_end] = temp_array[right_end];
20 }
21 void merge_sort(int *a, int *temp_array, int left, int right) //调用merge_sort(a, t, 0, len - 1)
22 {
23     int mid;
24     if (left < right)
25     {
26         mid = (left + right) / 2;
27         merge_sort(a, temp_array, left, mid);
28         merge_sort(a, temp_array, mid + 1, right);
29         merge(a, temp_array, left, mid + 1, right);
30     }
31 }
冒泡排序:重复交换相邻的两个反序元素。
 1 void bubble_sort(int *a, int len)
 2 {
 3     int i, j, t;
 4     for (i = 0; i < len; ++i)
 5         for (j = len - 1; j > i; --j)
 6             if (a[j] < a[j-1])
 7             {
 8                 t = a[j];
 9                 a[j] = a[j-1];
10                 a[j-1] = t;
11             }
12 }

希尔排序(shell):缩小增量排序,将待排序列划分为若干个较小的序列,分别进行直接插入排序,是需要排序的数列基本有序,最后再用依稀直接插入排序。一般取上一增量的一半作为此次划分的增量,直到增量为1.

 1 void shell_sort(int *a, int len)
 2 {
 3     int gap, i, j, t;
 4     for (gap = len / 2; gap > 0; gap /= 2)
 5         for (i = gap; i < len; ++i)
 6             for (j = i - gap; j >=0 && a[j] > a[j+gap]; j -= gap)
 7             {
 8                 t = a[j];    a[j] = a[j+gap];    a[j+gap] = t;
 9             }
10 }

堆排序:

 1 void swap(int *a, int *b)
 2 {
 3     int t = *a;    *a = *b; *b = t;
 4 }
 5 void max_heapify(int *a, int i, int heapsize)
 6 {
 7     int l = 2 * i + 1;
 8     int r = 2 * i + 2;
 9     int largest;
10     if (l <= heapsize - 1 && a[l] > a[i])
11         largest = l;
12     else
13         largest = i;
14     if (r <= heapsize - 1 && a[r] > a[i])
15         largest = r;
16     if (largest != i)
17     {
18         swap(&a[i], &a[largest]);
19         max_heapify(a, largest, heapsize);
20     }
21 }
22 void build_max_heap(int *a, int heapsize)
23 {
24     int i;
25     for (i = heapsize / 2 - 1; i >= 0; --i)
26         max_heapify(a, largest, heapsize);
27 }
28 void heap_sort(int *a, int len)
29 {
30     int i;
31     build_max_heap(a, len);
32     for (i = len - 1; i >= 1; --i)
33     {
34         swap(&a[0], &a[i]);
35         max_heapify(a, 0, i);
36     }
37 }

 快速排序:

void swap(int *a, int *b)
{
    int t = *x; *x = *y; *y = t;
}
int partition(int *a, int p, int r)
{
    int x = a[r];
    int i = p - 1;
    int j;
    for (j = 0; j <= r - 1; ++j)
    {
        if (a[j] <= x)
        {
            ++i;
            swap(&a[i], &a[j]);
        }
    }
    swap(&a[i+1], &a[r]);
    return i + 1;
}
void quick_sort(int *a, int p, int r)        //调用(a, 0, len - 1)
{
    if (p < r)
    {
        int q = partition(a, p, r);
        quick_sort(a, p, q - 1);
        quick_sort(a, q + 1, r);
    }
}

 

 

 

 

 

 

抱歉!评论已关闭.