• 数据结构与算法 多种排序算法


        排序有多种,里面的算法很巧妙,不写例子,只敲些核心代码。总体的有插入,选择,交换,分配,归并五种。有些没解释的是我感觉很难或者很偏。


    一、插入

        1.直接插入

         最直接明了,依次拿出排序码中的每一个,与前面的数比较大小,插入相应的位置。直至所有的数字比较完毕。


    int i,j,n;
    //n为排序码个数   data[n]为整个排序码组 
    Node temp;
    for(i = 1; i < n; ++i){
    	temp = data[i];
    	for(j = i-1; temp.value < data[i].value && j >= 0; j--)
    		data[j+1] = data[j];//从取出的数字后面开始往前面取,比该数字大的往前移
    	if(j != i -1) data[j+1] = temp; //如果循环中取出的数字保持原位不动 则不用更改 
    }


        2.二分法插入


    不用依次对比,如果前面的排好序,只需要找到前面排序码组的中间数,数大则在中间的前面,反之即后。

    int i,j,n,left,right,middle;
    //n为排序码个数   data[n]为整个排序码组 
    Node temp;
    for(i = 1; i < n; i++){
    	temp = data[i];
    	left = 0; 
    	right = i-1;
    	while(left <= right){
    		middle = (left + right )/2;
    		if(temp.value < data[middle].value)
    			right = middle -1;
    	    left = middle + 1;	
    	}
    	for(j = i-1; j >= left ; j--)
    		data[j+1] = data[j];/
    	if(left != i -1) data[left] = temp; //将找到的这个位置放进temp 
    }


    3.表插入排序。


    4.shell排序。

    这个是D.L.Shell提出,而他的时间复杂度的东西在《计算机程序设计艺术》有提到,盖茨说过,如果把这一套书读懂,可以直接把简历发给他。


    二、选择排序

        1、直接排序。

    最直接的方法,挑出排序码数组最小的数,放在第一位。再在剩余的数中挑出最小,放在第二位,很是直接,很简单。


       2.堆排序。


    三、交换排序。

        1.冒泡排序。

    很经典,像鱼泡一样的东西。

    int i,j,n,turn;
    //n为排序码个数   data[n]为整个排序码组 
    Node temp;
    for(i = 1; i < n; ++i){
    	turn = 1;
    	for(j = 0; j < n -i -1 ; j++){
    		temp = data[j];
    		data[j] = data[j+1];
    		data[j+1] = temp;
    		trun = 0;
    	}
    	if(turn) break;//当已经排好序后,后面无需再比较 
    }	



    2.快速排序。


    四、分配排序

    1.基数排序


    五、归并排序

    1.内排序

    和shell排序很像,但是shell是以一个数字进行跳跃对比,而内排序是一块和一块对比。


    2.外排序。

    复杂。。。。。。



                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       


  • 相关阅读:
    内部类,匿名内部类?
    抽象和接口的区别?
    多态的好处?
    怎么防止重复提交?
    java网络编程第二章
    java网络编程第一章
    多态的好处
    静态变量与实例变量(方法)的区别
    杨辉三角
    鸿蒙系统之内核层
  • 原文地址:https://www.cnblogs.com/james1207/p/3265207.html
Copyright © 2020-2023  润新知