精华内容
下载资源
问答
  • 直接插入排序法

    2019-07-26 08:25:24
    直接插入排序法,是一个比较简单的排序法,比较基础,可供参考
  • C语言代码 直接插入法排序算法fun1,冒泡法排序排列算法fun2,直接选择法排序算法fun3。
  • 直接插入排序法: 基本思想: 将一个记录插入到已排序好的有序数组中,从而得到一个新数组,记录数增1的有序数组。即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序...

    直接插入排序法:

    基本思想:

    将一个记录插入到已排序好的有序数组中,从而得到一个新数组,记录数增1的有序数组。即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止。

    要点:设立标志,作为临时存储和判断数组边界之用。
    在这里插入图片描述

    说明:
    1.准备一个数组 {31,25,12,64,20}
    2.原理:从第二个数开始,往前面插入(前面的子数组是有序数组)
    3.用循环,即可简单完成任务

    (31),25,12,64,20 原始数据

    (25,31),12,64,20 第一次插入
    (12,25,31),64,20 第二次插入
    (12,25,31,64),20 第三次插入
    (12,20,25,31,64) 第四次插入


    详细讲解排序的过程:

    31 25 12 64 20 原始数据

    第一轮循环: 标志位为num[1]; 设置temp=25
    首先判断nums[0]是不是比temp大,如果成立,前面的数往后挪一位,变为:
    31 31 12 64 20 第一次比较
    然后把 nums[0] = temp 结果如下:
    25 31 12 64 20

    第二轮循环: 标志位为num[2]; 设置temp=12
    1.先判断nums[1]是不是比temp大,如果成立,前面的数往后挪一位,变为:
    25 31 31 64 20 第一次比较
    2.判断nums[0]是不是比temp大,如果成立,前面的数往后挪一位,变为:
    25 25 31 64 20 第二次比较
    3.找到temp应该在的地方
    nums[0] = temp 结果如下:
    12 25 31 64 20

    第三轮循环 标志位为num[3]; 设置temp=64
    首先判断nums[2]是不是比temp大,如果不成立,则直接跳出,不许在比较了,结果为:
    12 25 31 64 20

    第四轮循环 标志位为num[4]; 设置temp=20

    1. 先判断nums[3]是不是比temp大,如果成立,前面的数往后挪一位,变为:
      12 25 31 64 64 第一次比较
    2. 判断nums[2]是不是比temp大,如果成立,前面的数往后挪一位,变为:
      12 25 31 31 64 第二次比较
    3. 判断nums[1]是不是比temp大,如果成立,前面的数往后挪一位,变为:
      12 25 25 31 64 第三次比较
    4. 找到temp应该在的地方
      nums[1] = temp 结果如下:
      12 20 25 31 64

    代码如下(java为例):(写法不唯一)

    public class test {
    	public static void main(String[] args) {
    		int[] nums = {12,20,25,31,64};
    		for (int i=1;i<nums.length;i++) {
    			int temp=nums[i];   //设置标志位(哨兵)
    			int j = 0;          //定义下标
    			for (j = i-1;j>=0;j--) {   		//从标志位之前的数往前遍历
    				if (nums[j]>nums[j+1]) {  	//依次判断标志位的数值大小,应该插到什么位置
    					nums[j+1] = nums[j];    //如果标志位的数要插到前面,需要把相应的数往后挪一位
    				}else {
    					break;     		//如果标志位的数比前面的数大,就不用继续向前比了,直接跳出
    				}
    			}
    			if (nums[j+1]!=temp) {  	//判断要插入的位置数是不是和temp相等
    				nums[j+1] = temp;     	//就把标志位的数(temp)插入到相应的位置
    			}
    		}
    		for(int i:nums) {  //遍历
    			System.out.println(i);
    		}
    	}
    }
    

    直接插入排序思路简单,但代码逻辑较难;
    算法的优点是简单,缺点是慢。
    排序的结果稳定

    展开全文
  • C++实现直接插入排序法

    千次阅读 2018-05-26 00:27:23
    直接插入排序法是将当前元素按照值大小,插入到有序元素组中的适当位置的一种排序方法。最直观的例子是玩扑克牌斗地主,每次摸牌之前,手上的牌是已经按大小排好顺序的,每次摸的牌都要插入到合适的位置。 因此,...

    直接插入排序法是将当前元素按照值大小,插入到有序元素组中的适当位置的一种排序方法。最直观的例子是玩扑克牌斗地主,每次摸牌之前,手上的牌是已经按大小排好顺序的,每次摸的牌都要插入到合适的位置。直接插入排序法的时间复杂度为O(n2n^2)
    因此,直接插入排序法的基本思想是

    • 对于当前插入的元素a[i],之前的序列a[0],a[1],…,a[i-1]是有序序列;
    • 比较a[i]与之前有序序列的值,找到a[i]合适的插入位置;
    • 将插入位置之后的元素顺次往后移动一个位置;
    • 把a[i]值放入已找到的合适的位置。

    在此举一个简单的例子:a[5] = {1,3,4,2,5},要求从小到大排序
    当i=3时,a[i]=2,按照上述思想,进行以下步骤:

    • ① 比较2与a[2]、a[1]、a[0]
      当发现a[i]>a[0],即2>1,此时知道a[3]=2应该插入到a[0]之后的位置
    • ②将a[0]到a[i]之间的元素向后移动一个位置
      原:a[1]=3,a[2]=4,a[3]=2
      现:a[2]=3,a[3]=4
    • ③把2放到a[1]处

    按照上述思想,代码如下:

    void sort_insert(int arr[],int n)
    {
    	int i,j;
    	for(i=1;i<n;i++)
    	{
    		for(j=i-1;j>=0;j--)
    		{
    			if(arr[i]>arr[j])
    				break;
    		}
    		int temp = arr[i];
    		for(int k=i-1;k>j;k--)
    			arr[k+1]=arr[k];
    		arr[j+1] = temp;
    	}
    }
    

    测试上述代码:

    int _tmain(int argc, _TCHAR* argv[])
    {
    	int tmpArray[10] = {2,-3,12,234,4,45,99,123,401,9};
    	cout<<"原始序列:"<<endl;
    	for(int i=0;i<10;i++)
    		cout<<tmpArray[i]<<", ";
    	cout<<"\n直接插入法排序后:"<<endl;
    	sort_insert(tmpArray,10);
    	for(int i=0;i<10;i++)
    		cout<<tmpArray[i]<<", ";
    	getchar(); 
    	return 0;
    }
    

    这里写图片描述


    欢迎关注知乎专栏:Jungle是一个用Qt的工业Robot
    欢迎关注Jungle的微信公众号:Jungle笔记
    在这里插入图片描述

    展开全文
  • 最近看数据结构时看到直接插入排序法,其基本思想是:将一个记录插入到已经排好序的有序表中,从而得到一个新的,记录数增1的有序表 下面是代码实现与测试 1 #include <iostream> 2 using namespace std...

    最近看数据结构时看到直接插入排序法,其基本思想是:将一个记录插入到已经排好序的有序表中,从而得到一个新的,记录数增1的有序表

    下面是代码实现与测试

     1 #include <iostream>
     2 using namespace std;
     3 void InsertSort(int *q,int L)
     4 {
     5     int i,j,temp;
     6     for(i=1;i<L;i++)
     7     {    
     8             temp=q[i];
     9             for(j=i-1;j>=0&&temp<q[j];--j)//扫描前面的i-1个数据,如果没有到头,并且插入的            
    10                 q[j+1]=q[j];//值小于当前值,那么就进行交换,因为前面i-1个数据都已经排好序了
    11             q[j+1]=temp;//所以只会交换一次就结束        
    12     }
    13 }
    14 int main()
    15 {
    16     int i=0;
    17     int a[10]={1,3,2,9,4,6,5,8,0,7};
    18     cout<<"原始数据是:"<<endl;
    19     for(i=0;i<10;i++)
    20         cout<<a[i]<<" ";
    21     cout<<endl<<"直接插入排序后:"<<endl;
    22     InsertSort(a,10);
    23     for(i=0;i<10;i++)
    24         cout<<a[i]<<" ";
    25     cout<<endl;
    26     getchar();
    27 }

    以上是结果...

    时间复杂度:

    直接插入排序比冒泡和简单选择排序的性能虽然要好一些,但是最后起时间复杂度依然是O(n^2)

    转载于:https://www.cnblogs.com/kb342/p/3736409.html

    展开全文
  • 直接插入排序的基本思想是:将 n 个有序数存放在数组 a 中,要插入的数为 x,首先确定 x 插在数组中的位置 p,然后将 p 之后的元素都向后移一个位置,空出 a(p),将 x 放入 a(p),这样可实现插入 x 后仍然有序。...

    直接插入排序的基本思想是:将 n 个有序数存放在数组 a 中,要插入的数为 x,首先确定 x 插在数组中的位置 p,然后将 p 之后的元素都向后移一个位置,空出 a(p),将 x 放入 a(p),这样可实现插入 x 后仍然有序。

    例 1

    本例子通过直接插入的方法对上述例子中的 number 数组进行排序。创建一个 Test27 类文件,在 main() 方法中开始编码,具体实现代码如下:

    public static void main(String[] args) {    int[] number = { 13, 15, 24, 99, 4, 1 };    System.out.println("排序前:");    for (int val : number) { // 遍历数组元素        System.out.print(val + " "); // 输出数组元素    }    int temp, j;    for (int i = 1; i < number.length; i++) {        temp = number[i];        for (j = i - 1; j >= 0 && number[j] > temp; j--) {            number[j + 1] = number[j];        }        number[j + 1] = temp;    }    System.out.println("\n排序后:");    for (int val : number) { // 遍历数组元素        System.out.print(val + " "); // 输出数组元素    }}

    在上述代码中,首先在控制台输出 number 数组中的元素,然后通过 for 循环对数组中的元素进行排序,最后再次输出排序后的元素。

    执行上述代码,最终的输出结果如下:

    排序前:
    13 15 24 99 4 1
    排序后:
    1 4 13 15 24 99

    0d2944f8cd59aa3e4a0d4f37cb4369a1.png

    展开全文
  • 自己写的直接插入排序法和分治法的C语言实现代码

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,699
精华内容 679
关键字:

直接插入排序法