直接插入排序,希尔排序,快速排序

来源:互联网 发布:淘宝海关拍卖车可靠吗 编辑:程序博客网 时间:2024/05/19 19:34

1.直接插入排序

原理:就是把一个元素向已经排好序的序列中插入(倒着遍历这个已经排好序的序列,找到合适的位置,后面的元素都后移一位,然后插入进去)

//直接插入排序

void directSort(int a[],int n)

{

    int key,j;

    for(int i =1; i<n; i++)//从第二个开始,因为第一个相当于已经排好序了

    {

        key = a[i];//记录要插入的元素

        for (j=i; j>=1; j--)//开始倒着遍历

        {

            if (a[j-1]>=key)//遇到比他大的,就后移

            {

                a[j] = a[j-1];//后移

            }else //直到遇到第一个比他小的,就跳出循环

            {

                break;

            }

        }

        a[j]=key;//赋值

}

2.希尔排序

原理:对直接插入排序的优化。先分组,然后使用直接插入排序

void xierTest(int a[],int count)

{

    int n = count/2;//分组是对半去分(组之后会越来越多)

    int j ,i,key;

    while (n>0)

    {

        for (i =0; i < n; i++)//依次拿每个组的相同位置去对比

        {

            key = a[i];

            for (j = i; j < count; j+=n)//然后按照直接插入排序的思想,对每个组相同位置的元素进行排序

            {

                if (key > a[j]) {

                    a[j] = a[j-n];

                }else

                {

                    break;

                }

            }

            a[j] = key;

        }

        n = n/2;

    }

}

3.快速排序

原理:简单点说就是选一个基准,然后实现比他小的在他左边,比他大的在他右边

快速排序 选取一个基准,然后先从右边扫描,直到遇到比基准小的(称为A),就把A放到基准左边,然后开始从左边扫描,直到遇到比基准大的(称为B),就B放到基准右边,然后又从右边开始扫描。最后直到左右两边对接上,就停止了。实现了左边的都是比基准小的,右边都是比基准大的,然后再递归调用左右两边的小数组,直到完成排序

void quickSort(int a[] ,int left, int right)

{

//递归结束条件是相遇

    if (left >= right) {

        return;

    }

    int i = left;

    int j = right;

    int key = a[left];

    

    while (i<j)

    {

        while (i<j&& a[j]>=key)//比他大的,就继续向左扫描

        {

            j--;

        }

        a[i] = a[j];//直到遇到第一个比他小的,放到左边

        while (i<j && a[i]<key)//比他小的,就继续向右扫描

        {

            i++;

        }

        a[j] = a[i];//直到遇到第一个比他大的,放到右边

    }

    a[i] = key;//排序完成,讲基准值回归

    quickSort(a, left, i-1);//递归去排序左边的

    //中间的数不需要再动

    quickSort(a, i+1, right);//递归去排序右边的

}



0 0
原创粉丝点击