直接插入排序

java各种排序算法及实现

不羁岁月 提交于 2020-03-26 00:18:44
3 月,跳不动了?>>> 先来看看8种排序之间的关系: 下图是各种排序的比较: 1, 直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排 好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数 也是排好顺序的。如此反复循环,直到全部排好顺序。 在插入算法中,如果有一个最小的数在数组的最后面,用插入算法就会从最后一个 位置移动到第一个。 (2)实例 package cglib; public class StringNumber { public static void insertSort(int[] a) { if (a == null || a.length < 2) { return; } int length=a.length; //数组长度 int j; //当前值的位置 int i; //指向j前的位置 int key; //当前要进行插入排序的值 //从数组的第二个位置开始遍历值 for(j=1;j<length;j++){ key=a[j]; i=j-1; System.out.println(" 将i="+i); //a[i]比当前值大时,a[i]后移一位,空出i的位置,好让下一次循环的值后移 while(i>=0 && a[i]>key){ System.out.println("进 i="+i); a[i+1]

排序算法复习—直接插入排序

馋奶兔 提交于 2020-03-17 18:22:42
直接插入排序的 工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 插入排序 在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。 具体算法描述如下: 1.从第一个元素开始,该元素可以认为已经被排序 2.取出下一个元素,在已经排序的元素序列中从后向前扫描 3.如果该元素(已排序)大于新元素,将该元素移到下一位置 4.重复步骤3,直到找到已排序的元素小于或者等于新元素的位置 5.将新元素插入到该位置后 6.重复步骤2~5 还是代码看着直接,C语言实现如下: 1 int a[]={2,5,4,6,3}; 2 int length=sizeof(a)/sizeof(int); 3 int n=length-1; 4 int i,j,key; 5 6 for(i=1; i<=n;i++) 7 { 8 if(a[i]<a[i-1]) 9 { 10 key=a[i]; 11 for(j=i-1;j>=0&&a[j]>key;j--) 12 { 13 a[j+1]=a[j];//后移 14 } 15 a[j+1]=key; 16 } 17 } 在STL的sort算法和stdlib的qsort算法中,都将插入排序作为快速排序的补充

C#各种排序算法代码实现

被刻印的时光 ゝ 提交于 2020-03-06 11:48:49
转自: https://blog.csdn.net/sniper007/article/details/53080131 排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列。分内部排序和外部排序。若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序。反之,若参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序。内部排序的过程是一个逐步扩大记录的有序序列长度的过程。 将杂乱无章的数据元素,通过一定的方法按关键字顺序排列的过程叫做排序。假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。 分类 稳定排序:假设在待排序的文件中,存在两个或两个以上的记录具有相同的关键字,在用某种排序法排序后,若这些相同关键字的元素的相对次序仍然不变,则这种排序方法是稳定的。其中冒泡,插入,基数,归并属于稳定排序,选择,快速,希尔,堆属于不稳定排序。 就地排序:若排序算法所需的辅助空间并不依赖于问题的规模n,即辅助空间为O(1),则称为就地排序。(百度百科) 冒泡排序 已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先比较a[1

直接插入排序

戏子无情 提交于 2020-03-06 09:11:57
插入排序是把一个记录插入到已排序的有序序列中,使整个序列在插入该记录后仍然有序。插入排序中较简单的一种方法是直接插入排序,其插入位置的确定方法是将待插入的记录与有序区中的各记录自右向左依次比较其关键字值的大小。 核心算法:直接插入排序 设定待插入元素左边的元素都是按从小到大有序排列 ①从s[2]开始往右依次 选择待插入的元素 s[i]存入s[0]中,则s[i]空闲。 ②将待插入的元素s[i] 与它左边的各元素比较 (往左第一个,往左第二个……依次),若有比它大的,则将与它比较的元素向 右移 一个单位。 ③将s[0]中存放的待 插入 的元素插入s[j+1]的位置 可 自定义函数insort() 将一组数据从小到大排列: void insort(int s[],int n) { int i,j; for(i=2;i<=n;i++) { s[0]=s[i]; j=i-1; while(s[0]<s[j]) { s[j+1]=s[j]; j–; } s[j+1]=s[0]; } } 注意: ① 监视哨 的作用,存放后面的数据,防止前面的数据在后移时导致后面的数据丢失。 详见 直接插入排序——监视哨的作用 ②对于 数组中数据的输入和输出 要结合循环结构才能使用 ③ 以数组为参数的函数的使用 : 定义:函数返回值类型 函数名(形参数组类型 形参数组名[])

常用的排序算法(一)

萝らか妹 提交于 2020-03-02 04:38:22
Date: 2016-02-14 #####排序算法的学习 #### 冒泡排序 时间复杂度:当顺序为正序的时候,为最好状态时间复杂度为O(N),平均时间复杂的为O(N^2) 因为没有创建新的存储结构所以空间复杂度为O(1) 冒泡排序是一种稳定的排序算法 #include <stdio.h> void Bubble_sort(int A[],int n); void Bubble_sort(int A[],int n){ int i,j,temp; for(i= 0 ;i < n - 1 ;i++){ for(j = 0;j< n -1 - i;j++){ if(A[j] > A[j+1]){ temp = A[j+1]; A[j+1] = A[j]; A[j] = temp; } } } } int main(int argc, const char * argv[]) { int A[7]={3,1,2,4,6,8,1}; Bubble_sort(A, 7); for(int i =0; i < 7;i++){ printf("%d",A[i]); } } ####改进的冒泡排序 使用冒泡排序对N个数据进行排序,一共需要进行n-1次比较,本来是正常顺序的数据也需要进行n-1次排序,所以当判断所有的数据为有序的时候不在进行排序直接跳出循环, void Bubble_sort(int

Java 实现常见内排序

北城以北 提交于 2020-03-01 19:58:58
一、内排序 1、排序基本概念 (1)什么是排序?   排序指将一个数据元素集合或者序列 按照某种规则 重新排列成一个 有序的集合或者序列。分为内排序、外排序。排序算法的好坏直接影响程序的执行速度以及存储空间的占有量。 (2)什么是内排序?外排序?   内排序:指待排序的序列完全存放在内存中所进行的排序过程(不适合大量数据排序)。   外排序:指大数据的排序,待排序的数据无法一次性读取到内存中,内存与外存需进行多次数据交换,以达到排序的目的。 (3)什么是稳定排序?   稳定排序指的是 相等的数据经过某种排序算法排序后,仍能保证它们的相对顺序与未排序之前相同。   比如一个序列 a1 a2 a3 a4 a5, 且 a1 < a2 = a3 < a4 < a5。   若经过某种排序算法后,结果仍为 a1 < a2 = a3 < a4 < a5,那么该排序算法是稳定的。   若经过某种排序算法后,结果为 a1 < a3 = a2 < a4 < a5,那么该排序算法是不稳定的。 2、内排序分类 (1)按种类划分:   插入排序:直接插入排序、希尔排序。   选择排序:选择排序、堆排序。   交换排序:冒泡排序、快速排序。   归并排序:归并排序。 (2)按稳定排序划分:   稳定排序:冒泡排序、归并排序、直接插入排序。   非稳定排序:快速排序、希尔排序、堆排序、选择排序。 (3)比较:

直接插入排序

℡╲_俬逩灬. 提交于 2020-03-01 03:44:21
public class Mytest{ public static void main(String[]args){ int []arr={9,-4,6,-100}; insertSort(arr); System.out.println(Arrays.toString(arr)); } public static void insertSort(int []arr){ for (int i=1;i<arr.length;i++){ int temp=arr[i]; int j; for ( j=i;j>0&&temp<arr[j-1];j--){ arr[j]=arr[j-1]; } arr[j]=temp; } } } 来源: CSDN 作者: xiaohanguo_xiao 链接: https://blog.csdn.net/xiaohanguo_xiao/article/details/104582107

排序算法

社会主义新天地 提交于 2020-02-08 05:13:18
排序算法 文章目录 排序算法 1.数据结构定义 2.冒泡排序 3.冒泡排序的改进 4.简单选择排序 5.直接插入排序 6.希尔排序(相当于直接插入排序的升级,先搞懂插入排序) 7.堆排序(相当于简单选择排序的升级) 8.归并排序 9.快速排序(冒泡排序的升级) 参考 1.数据结构定义 # define MAXSIZE 10000 /* 用于要排序数组个数最大值,可根据需要修改 */ typedef struct { int r [ MAXSIZE + 1 ] ; /* 用于存储要排序数组,r[0]用作哨兵或临时变量 */ int length ; /* 用于记录顺序表的长度 */ } SqList ; /* 交换L中数组r的下标为i和j的值 */ void swap ( SqList * L , int i , int j ) { int temp = L -> r [ i ] ; L -> r [ i ] = L -> r [ j ] ; L -> r [ j ] = temp ; } 2.冒泡排序 平均时间复杂度:O(n2) 从后往前依次比较相邻的两个数,如果后面的数比较小就交换位置,这样的话每循环一次就会有一个最小值被换到最前面了,然后再依次把其他的数冒上去。 go语言实现: // BubbleSort 冒泡排序 func BubbleSort ( array [ ] int

直接插入排序练习:POJ 2388

那年仲夏 提交于 2020-01-30 14:00:17
关于直接插入排序请参看: http://128kj.iteye.com/blog/1662280 POJ2388题意: 【输入】第一行为n,接下来n行分别为一个数; 【输出】这n个数排序后的中位数 样例: Sample Input 5 2 4 1 3 5 Sample Output 3 分析:好象用多种排序法都可以AC,前面用了堆排序,这里再用直接插入排序,主要是复习一下代码。比起堆排序,代码短多了。 排一次序后输出中位数,但效率太低了。这里先不管了。 Java代码 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in= new Scanner(System.in); int n=in.nextInt(); int [] array = new int [n]; for ( int i= 0 ;i<n;i++) array[i]=in.nextInt(); sort(array); System.out.println(array[n / 2 ]); //for(int el : array) { // System.out.print(el + " "); //} } static void sort( int [] array) {

直接插入排序

二次信任 提交于 2020-01-24 19:43:29
直接插入排序 时间复杂度: O(N ^ 2) (最坏情况下 - 无序) O(N) (最好情况下 - 有序) 稳定性 :稳定 实现原理: 简单的说,就是把数组划分为两个部分,一部分已经有序(在最开始的时候,就把第一个元素,看成有序的那部分),一部分未排序; 每次从未排序的部分,取第一个元素,然后遍历有序部分,进行比较,找到位置以后,就将这个元素插进去。 具体做法就是,找到位置以后,不断把已经有序的元素后移,给待插入的元素让位。 移动完以后,再把元素放到那个为它空出来的数组位置。这样,一趟插入排序就完成了。 代码示例: public static void insertSort ( int [ ] array ) { for ( int i = 1 ; i < array . length ; i ++ ) { int tmp = array [ i ] ; int j = i - 1 ; for ( j = i - 1 ; j >= 0 ; j -- ) { if ( array [ j ] > tmp ) { array [ j + 1 ] = array [ j ] ; } else { break ; } } array [ j + 1 ] = tmp ; } } 来源: CSDN 作者: Anonyme(ღ˘⌣˘ღ) 链接: https://blog.csdn.net/qq