四、数据结构与算法--其他排序

除了冒泡排序和选择排序以外,还有插入排序、快速排序(检查快排)

 插入排序:顾名思义,是一种插入的操作,即假定前边已经有序,拿到有序后边的数字一次和前面的数做比较,直到插入到前边的数比他大为止。这样将是不是很抽象呢?好吧我们先看代码, count是a数组的总数:

void insertSort(int a[], int count) {

    for (int i = 1; i < count - 2; i++) {

        int needInsertNumber = a[i];

        int j = i;

        while (a[i] < a[j-1] && j > 0) {

            a[j] = a[j-1];

            j--;

        }

        a[j] = needInsertNumber;

    }


    printf("\n插入排序结果:");

    for (int i = 0; i < count; i++) {

        printf("%d\t", a[i]);

    }

}


代码中,可以看到,i代表我们将要插入的数字(即还未被排序的数字),用while循环来控制和前边的数字是否需要插入到此处,ok,我们分析下这段代码,首先拿出了第二个数字53,然后比较53和53之前的数字,53之前的数字3小于53所以不进入while循环,此时数组没有变化,i++,此时i = 2,拿出23,23和53做比较,发现53>23,进入循环此时数组里23和53做了交换,然后j--,此时j=1,所有j-1de位置是3,23和3又做了比较,发现3<23,退出while循环,for循环拿出54.。。。看懂了吗?排队中一次拿出下一个,插入到已经排好序的前边,其实也不难理解是不是

总结:插入排序比冒泡要快一倍,很多时候比选择排序也要快一些


希尔排序:应该说希尔排序也属于插入排序,希尔排序增加了比较的跨度,所以希尔排序比直接插入排序会效率高一点,但是希尔排序的效率还是不如快速排序,如果数据量小的话,基本都还ok,如果数据量上来建议大家选择快速排序。

基本原理:不再比较挨着的数字,而是做间隔比较。间隔越来越小,直到间隔为1的时候,排序停止,不多说了直接代码:


快速排序:快排应该是效率最高的,最好的一种排序方法,对冒泡算法进行了改进。

基本原理:以一个数为基准数据,将数据分为两组:左边比基准数据小,右边比基准数据大。然后采用递归方式再将这两组数据按相同的方式去排序,知道最后排好顺序为止。

代码如下:

void xierSort (int a[], int count) {

    int d = count/2;

    int forCount = 0;//循环次数

    int changeCount = 0;//交换次数

    while (d > 0) {

        for (int i = 0; i < d; i++) {

            for (int j = i; j + d < count; j+=d) {

                forCount++;

                if (a[j] > a[j + d]) {

                    changeCount++;

                    int tmp = a[j];

                    a[j] = a[j+d];

                    a[j+d] = tmp;

                }

            }

        }

        d --;

    }

    

    printf("\n希尔排序\t循环次数:%d\t交换次数%d\n结果:", forCount, changeCount);

    for (int i = 0; i < count; i++) {

        printf("%d\t", a[i]);

    }

}


quickSort(a, 0, count-1);


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

    if (left < right) {

        int i = left;

        int j = right;

        int key = a[left];

        while (i < j) {

            while (a[j] > key) {

                j--;

            }

            a[i] = a[j];

            a[j] = key;

            

            while (a[i] < key) {

                i++;

            }

            a[j] = a[i];

            a[i] = key;

        }

        quickSort(a, left, i-1);

        quickSort(a, i+1, right);

    }

}


有什么问题可以私信我,欢迎大家指点交流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值