插入排序--八大排序算法[java][C语言]

插入排序

持续更新算法与数据结构,感兴趣看下其他文章

算法动画演示

插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。3.1 算法描述一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:
1.从第一个元素开始,该元素可以认为已经被排序;
2.取出下一个元素,在已经排序的元素序列中从后向前扫描;
3.如果该元素(已排序)大于新元素,将该元素移到下一位置;
4.重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
5.将新元素插入到该位置后;重复步骤2~5。

代码

java

package sort;

import java.util.Arrays;

public class InsertSort {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//int arr[] = {1,3,2,4,9,6,7,5,8,10};
		int arr[] = {101,34,119,1};
		System.out.println("排序前:");
		System.out.println(Arrays.toString(arr));
		insertSort(arr);
		System.out.println("排序后:");
		System.out.println(Arrays.toString(arr));
	}//main
	public static void insertSort(int[] arr){
		System.out.println("...........................");
		//第一轮
		int insertVal = arr[1];
		int insertIndex = 1-1;//arr[1]前面数的下标
		//给insertVal找到插入位置
		/**说明
		 * 1.insertIndex》=0保证insertVal找插入位置,且不越界
		 * 2.insetVal《arr【insertIndex】 还没找到插入位置
		 * 3.将arr[insertindex]后移
		 * */
		while(insertIndex >= 0 && insertVal < arr[insertIndex]) {
			arr[insertIndex + 1] = arr[insertIndex];
			insertIndex--;
		}
		//退出循环时 insertIndex+1 因为退出循环前--
		arr[insertIndex + 1] = insertVal;
		System.out.println("第一轮插入:");
		System.out.println(Arrays.toString(arr));
		
		//第二轮
		insertVal = arr[2];
		insertIndex = 2-1;//arr[1]前面数的下标
		//给insertVal找到插入位置
		/**说明
		 * 1.insertIndex》=0保证insertVal找插入位置,且不越界
		 * 2.insetVal《arr【insertIndex】 还没找到插入位置
		 * 3.将arr[insertindex]后移
		 * */
		while(insertIndex >= 0 && insertVal < arr[insertIndex]) {
			arr[insertIndex + 1] = arr[insertIndex];
			insertIndex--;
		}
		//退出循环时 insertIndex+1 因为退出循环前--
		arr[insertIndex + 1] = insertVal;
		System.out.println("第二轮插入:");
		System.out.println(Arrays.toString(arr));
		
		//第三轮
		insertVal = arr[3];
		insertIndex = 3-1;//arr[1]前面数的下标
		//给insertVal找到插入位置
		/**说明
		 * 1.insertIndex》=0保证insertVal找插入位置,且不越界
		 * 2.insetVal《arr【insertIndex】 还没找到插入位置
		 * 3.将arr[insertindex]后移
		 * */
		while(insertIndex >= 0 && insertVal < arr[insertIndex]) {
			arr[insertIndex + 1] = arr[insertIndex];
			insertIndex--;
		}
		//退出循环时 insertIndex+1 因为退出循环前--
		arr[insertIndex + 1] = insertVal;
		System.out.println("第三轮插入:");
		System.out.println(Arrays.toString(arr));
		System.out.println("...........................");
		
		//总结
		for (int i = 1; i < arr.length; i++) {
			insertVal = arr[i];
			insertIndex = i-1;//arr[1]前面数的下标
			//给insertVal找到插入位置
			/**说明
			 * 1.insertIndex》=0保证insertVal找插入位置,且不越界
			 * 2.insetVal《arr【insertIndex】 还没找到插入位置
			 * 3.将arr[insertindex]后移
			 * */
			while(insertIndex >= 0 && insertVal < arr[insertIndex]) {
				arr[insertIndex + 1] = arr[insertIndex];
				insertIndex--;
			}
			//退出循环时 insertIndex+1 因为退出循环前--
			arr[insertIndex + 1] = insertVal;
			System.out.println("第"+i+"轮插入:");
			System.out.println(Arrays.toString(arr));
		}
		
		System.out.println("...........................");
		
		//for---自己
		int temp;
		for (int i = 1; i < arr.length; i++) {//从第二个元素开始
				temp = arr[i];
				
				for (int j = i - 1; j >= 0; j--) {
					
					if(temp > arr[j]) {
						arr[j+1] = arr[j];
						arr[j] = temp;
				}
					
			}
			
		}
		System.out.println(Arrays.toString(arr));
		System.out.println("...........................");
	}//sort
}//主类

c语言

/**
     * 插入排序
     * @param array
     * @return
     */
    public static int[] insertionSort(int[] array) {
        if (array.length == 0)
            return array;
        int current;
        for (int i = 0; i < array.length - 1; i++) {
            current = array[i + 1];
            int preIndex = i;
            while (preIndex >= 0 && current < array[preIndex]) {
                array[preIndex + 1] = array[preIndex];
                preIndex--;
            }
            array[preIndex + 1] = current;
        }
        return array;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值