插入排序 | 冒泡排序 | 希尔排序 | 堆排序 | 快速排序 | 选择排序 | 归并排序

以下是最近学习各种算法的代码实现:

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <limits.h>
typedef int EleType;
typedef int (*CompFunc)(void *,void *);
int IntComp(void * a,void *b)
{
    if(*(int *)a > *(int *)b) return 1;
    if(*(int *)a == *(int *)b) return 0;
    if(*(int *)a < *(int *)b) return -1;
}
void insertion_sort(EleType A[],int N,CompFunc f)
{
    int step;
    EleType tmp;
    int i;
    for(step = 1; step < N; ++step)
    {
        tmp = A[step];
        for(i = step -1; i >= 0; --i)
        {
            if(f(&A[i],&tmp) > 0)
            {
                A[i+1] = A[i];
            }
            else //退出!!!!!!!
                break;
        }
        A[i+1] = tmp;
    }
}
void bubble_sort(EleType A[],int N,CompFunc f)
{
    int step,i;

    EleType tmp;
    int flag = 0;
    for(step = 0; step < N-1; ++step)
    {
        flag = 0;
        for(i = N-1; i > step ; --i)
        {
            if(f(&A[i-1],&A[i]) > 0)
            {
                // swap
                tmp = A[i-1];
                A[i-1] = A[i];
                A[i] = tmp;
                flag = 1;
            }
            else
                continue;
        }
        if(!flag)
            break;
    }
}

void shell_sort(EleType A[],int N,CompFunc f)
{
    int step,i,h;
    EleType tmp;
    // determine start of h
    for(h = 1; h < N/9; h = 3*h+1)
        ;
    for(; h >=1; h = h/3)
    {
        for(step = h; step < N; step++)
        {
            tmp = A[step];
            for(i = step-h; i >=0; i-=h)
            {
                if( f(&tmp,&A[i]) <0 )
                {
                    A[i+h] = A[i];
                }//退出
                else
                    break;
            }
            A[i+h] = tmp;
        }
    }

}

// heapsort
// 第一个元素位置为0
#define LeftChild(i) (2*(i)+1)

void print_array(EleType A[],int N)
{
    for(int i = 0; i < N; ++i)
        printf("%3d",A[i]);
    printf("\n");
}
void percdown(EleType A[],int i, int N,CompFunc f)
{
    int Child;
    EleType tmp;
    for(tmp = A[i]; LeftChild(i) < N; i = Child)
    {
        Child = LeftChild(i);
        if(Child != N-1 && f(&A[Child+1] ,&A[Child])>0 )
            Child++;
        if(f(&tmp,&A[Child]) < 0)
            A[i] = A[Child];
        else
            break;
    }
    A[i] = tmp;
}

void heap_sort(EleType A[], int N,CompFunc f)
{
    int i;
    EleType tmp;
    for(i = N/2; i >= 0; i--)
    {
        percdown(A,i,N,IntComp);
        //#ifdef DEBUG
        //print_array(A,N);
        //#endif
    }
    for(i = N-1; i > 0; i--)
    {
        tmp = A[i];
        A[i] = A[0];
        A[0] = tmp;
        percdown(A,0,i,IntComp);
    }
}

// quicksort
int qsort_partition(EleType A[],int p,int q,CompFunc f)
{
    int rd = (((double)rand())/((double)RAND_MAX))*(q-p) + p;
    EleType tmp;
    tmp = A[p];
    A[p] = A[rd];
    A[rd] = tmp;

    int i = p;    int j = p+1;

    while(j <= q)
    {
        if( f(&A[p],&A[j]) > 0 )
        {
            ++i;
            tmp = A[i];
            A[i] = A[j];
            A[j] = tmp;
            ++j;
        }
        else
            ++j;
    }
    tmp = A[i]    ;
    A[i]=A[p];
    A[p] = tmp;
    return i;
}
void qsort_recursion(EleType A[],int p, int q, CompFunc f)
{
    if(p < q)
    {
        int r = qsort_partition(A,p,q,f);
        qsort_recursion(A,p,r-1,f);
        qsort_recursion(A,r+1,q,f);
    }
}
void quick_sort(EleType A[],int N,CompFunc f)
{
    srand((unsigned int )time(NULL));
    qsort_recursion(A,0,N-1,f);
}
// selection sort
void selection_sort(EleType A[], int N, CompFunc f)
{
    EleType tmp;
    int max_index;
    for(int i = N-1; i > 0; i--)
    {
        max_index = i;
        for(int j = 0; j < i; ++j)
        {
            if( f( &A[max_index] , &A[j] ) < 0 )
            {
                max_index = j;
            }
        }
        tmp = A[max_index];
        A[max_index] = A[i];
        A[i] = tmp;
    }
}
// merge sort
void merge_divide(EleType A[],int p, int q,CompFunc f)
{
    if( q - p < 1 )  return ;
    // divide routine
    int mid = (p + q) /2;
    merge_divide(A, p , mid, f);
    merge_divide(A,mid+1, q, f);
    // merge routine
    int * tmp =(int *) malloc(sizeof(EleType) * (q - p + 1) );
    int i, m, n;
    m = p; n = mid + 1;
    i = 0;
    while(m <= mid && n <= q)
    {
        if( f( &A[m], &A[n]) < 0)
        {
            tmp[i++] = A[m++];
        }else
        {
            tmp[i++] = A[n++];
        }
    }
    while(m <= mid)
        tmp[i++] = A[m++];
    while(n <= q)
        tmp[i++] = A[n++];

    if(i != q - p +1)
    {
        printf("Error: p = %d, q = %d\n",p,q);
    }

    // copy back
    int j = p;
    for(i = 0; i <= q-p; i++)
    {
        A[j++]  =tmp[i];
    }
    free(tmp);
}
void merge_sort(EleType A[], int N, CompFunc f)
{
    merge_divide(A,0,N-1,f);
}

#define ITEMNUM 2000
 int main()
 {

    int i;
     int A1[ITEMNUM ],A2[ ITEMNUM],A3 [ITEMNUM],A4[ITEMNUM];
     srand((unsigned int )time( NULL));
     for(i = 0; i < ITEMNUM; ++i )
     {
          A4[i] = A1 [i]= A2[i]=A3 [i]= rand();
     }
     clock_t start,finish;

     double d1,d2,d3,d4;

     merge_sort(A1,ITEMNUM,IntComp);
     quick_sort(A3,ITEMNUM,IntComp);
     shell_sort(A4,ITEMNUM,IntComp);

     for(i = 0; i < ITEMNUM; ++i )
     {
          printf("%5d %5d %5d %5d\n",A2[i],A1[i],A3[i],A4[i]);
     }

     //insertion_sort(A1,ITEMNUM,IntComp);
     //bubble_sort(A2,ITEMNUM,IntComp);
/*
     start = clock();
     qsort(A1,ITEMNUM,sizeof(EleType),IntComp);
     finish = clock();
     d1 = finish - start;

     start = clock();
     quick_sort(A2,ITEMNUM,IntComp);
     finish = clock();

     d2 = finish - start;

     start = clock();
     shell_sort(A3,ITEMNUM,IntComp);
     finish = clock();

     d3 = finish - start;

     start = clock();
     heap_sort(A4,ITEMNUM,IntComp);
     finish = clock();

     d4 = finish - start;
     printf("qsort time spending: %f\n",d1);
     printf("quick sort time spending:%f\n",d2);
     printf("shell sort time spending: %f\n", d3);
     printf("heap sort time spending: %f\n",d4);
     */

     /*
      for(i = 0; i < ITEMNUM; ++i )
     {
          printf ("%10d%10d%10d\n",A1[i ],A2[ i],A3[i ]);
     }
*/
// test heap sort
/*
    int A[] = {3,5,6,8,9,4,1,7,2,0};
    int N = sizeof(A)/sizeof(A[0]);
    print_array(A,N);

    heap_sort(A,N);

    printf("result:\n");
    print_array(A,N);

    return 0;*/

 }

插入排序 | 冒泡排序 | 希尔排序 | 堆排序 | 快速排序 | 选择排序 | 归并排序,布布扣,bubuko.com

时间: 2024-10-27 01:16:07

插入排序 | 冒泡排序 | 希尔排序 | 堆排序 | 快速排序 | 选择排序 | 归并排序的相关文章

直接插入排序&&冒泡排序&&希尔排序(缩小增量排序)源码

public class DirectRank { public static void main(String[] args) { DirectRank aa=new DirectRank(); try { aa.judge(args); } catch (TestDefinException e2) { e2.printStackTrace(); } Integer[] a=new Integer[args.length]; try{for(int i=0;i<args.length;i++

选择排序算法---直接选择排序和堆排序

本文主要是解析选择排序算法:直接选择排序和堆排序. 一.直接选择排序   基本思想:       选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾.以此类推,直到所有元素均排序完毕. 选择排序的主要优点与数据移动有关.如果某个元素位于正确的最终位置上,则它不会被移动.选择排序每次交换一对元素,它们当中至少有一个将被移到其最终

C语言排序算法之简单交换法排序,直接选择排序,冒泡排序

C语言排序算法之简单交换法排序,直接选择排序,冒泡排序,最近考试要用到,网上也有很多例子,我觉得还是自己写的看得懂一些. 简单交换法排序 1 /*简单交换法排序 2 根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置 3 交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动 4 不稳定 5 */ 6 #include<windows.h> 7 #include<stdio.h> 8 void main(){ 9 int i,j,arr[10

排序算法——直接选择排序

直接选择排序每一趟排序都会从未排序的序列中选择出最小的元素来,然后跟未排序序列的第一个元素交换.这样经过n-1趟排序后,每趟排序选择出的 最小元素便成了有序的序列. 算法实现如下: #include <stdio.h> #include <stdlib.h> void SelectSort(int A[],int n) { int i, j, index, temp; for(i = 0; i < n-1; i++) // 进行n-1趟排序 { index = i; // 辅

我的Java开发学习之旅------&gt;Java经典排序算法之选择排序

一.算法原理 对比数组中前一个元素跟后一个元素的大小,如果后面的元素比前面的元素小则用一个变量k来记住他的位置, 接着第二次比较,前面"后一个元素"现变成了"前一个元素",继续跟他的"后一个元素"进行比较如果后面的元素比 他要小则用变量k记住它在数组中的位置(下标),等到循环结束的时候,我们应该找到了最小的那个数的下标了, 然后进行判断,如果这个元素的下标不是第一个元素的下标,就让第一个元素跟他交换一下值,这样就找到整 个数组中最小的数了.然后找

经典排序算法--简单选择排序

算法简介 简单选择排序是一种选择排序. 选择排序:每趟从待排序的记录中选出关键字最小的记录,顺序放在已排序的记录序列末尾,直到全部排序结束为止. 白话理解 依然已排队为例,在排队时,有的老师可能会选择这样排序,先在一列中选出最矮的,放在第一位,然后选出第二矮的,放在第二位.队伍完成排序.而这就是选择排序的思想. 简单排序处理流程 (1)从待排序序列中,找到关键字最小的元素: (2)如果最小元素不是待排序序列的第一个元素,将其和第一个元素互换: (3)从余下的 N - 1 个元素中,找出关键字最小

数据结构排序算法之选择排序

今天继续介绍一种排序算法:选择排序. 选择排序的基本思想就是从待排序列中选择出最小的,然后将被选出元素和序列的第一个元素互换位置(当前默认是升序排列),则互换完成后第一个元素就是整个序列的最小的元素,则一次选择排序结束.然后我们从剩下的子序列中选择出最小的,然后将该被选出来的元素和该子序列的第一个元素(即整个序列的第二个元素)互换位置,则当前整个序列的第二个元素就是当前序列中的次最小值,第二次选择排序结束.以此类推,直到该待排序列只剩下一个元素后,则整个序列有序. 具体过程如下图所示: 下面就不

排序算法之选择排序

一. 算法描述 选择排序:在一个长度为N的无序数组中,在第一趟遍历N个数据,找出其中最小的数值与第一个元素交换,第二趟遍历剩下的N-1个数据,找出其中最小的数值与第二个元素交换......第N-1趟遍历剩下的2个数据,找出其中最小的数值与第N-1个元素交换,至此选择排序完成. 二. 算法分析 平均时间复杂度:O(n2) 空间复杂度:O(1)  (用于交换和记录索引) 稳定性:不稳定 (比如序列[5, 5, 3]第一趟就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面) 三. 算法实现

算法学习之排序算法:选择排序

选择排序:每一趟在n-i+1(i=1,2,...,n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录. 一.简单选择排序 一趟选择排序操作: 通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1<=i<=n)个记录交换之. 对L[1...n]中记录进行简单选择排序的算法为:令i从1至n-1,进行n-1趟选择操作.简单选择排序过程中,所需进行记录移动的操作次数较少,然而,无论记录的初始排列如何,所需关键字间的比较次数相同.因此,总的时间复杂度为O(n^2)