直接插入排序的加强版

如有时间。再在原地,把重复的元素干掉,i指向无重复的,j向后遍历

package jjj;

import java.util.Arrays;
import java.util.Scanner;

public class hhhhhhhhhhh {

	public static void main(String[] args){
		int a[] = {-1,1,2,1,1,1,1,3,2,1,1,1,0,1,1,0};
		shu(a,a.length);
		System.out.println(Arrays.toString(a));

	    }

	static int max(int a,int b){
	    if(a>b) return a;
	    return b;
	}
	static int min(int a,int b){
	    if(a>b) return b;
	    return a;
	}

	static void shu(int a[],int N)
	{

	     //转入第一个元素
	     for(int j=4;j<N;j=j+3){
	    	int a1,a2,a3;
	        int i =j;
	        while(a[i]<a[i-3]&&i>=4){
	            a1=a[i-3];  a2=a[i-2]; a3=a[i-1];
	            a[i-3]=a[i]; a[i-2]=a[i+1]; a[i-1]=a[i+2];
	            a[i]=a1; a[i+1]=a2;a[i+2]=a3;
	            i=i-3;
	        }
	    }

	     for(int jJ=4;jJ<N;jJ=jJ+3){
	            int i = jJ;  //费了很多时间,你是想用上面的那个插入方法,while里面会用很多的判断

	            while(i>=4){
	            //三重防护
	            if(a[i]>a[i-3]) {i=i-3; continue;}//不用交换了
	            if((a[i]==a[i-3]) && max(a[i+1],a[i+2])>max(a[i-2],a[i-1]) ) {i=i-3;continue;}
	            if((a[i]==a[i-3]) && max(a[i+1],a[i+2])==max(a[i-2],a[i-1]) &&  min(a[i+1],a[i+2])>=min(a[i-2],a[i-1]) ) {i=i-3;continue;}
	            //交换区
	            int a1,a2,a3;
	            a1=a[i-3];  a2=a[i-2]; a3=a[i-1];
	            a[i-3]=a[i]; a[i-2]=a[i+1]; a[i-1]=a[i+2];
	            a[i]=a1; a[i+1]=a2;a[i+2]=a3;
	            i=i-3;
	            }
	      }

	}

}

  

时间: 2024-12-08 09:36:20

直接插入排序的加强版的相关文章

算法 排序lowB三人组 冒泡排序 选择排序 插入排序

参考博客:基于python的七种经典排序算法   [经典排序算法][集锦]     经典排序算法及python实现 首先明确,算法的实质 是 列表排序.具体就是操作的列表,将无序列表变成有序列表! 一.排序的基本概念和分类 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法. 排序的稳定性: 经过某种排序后,如果两个记录序号同等,且两者在原无序记录中的先后秩序依然保持不变,则称所使用的排序方法是稳定的,反之是不稳定

两种插入排序算法java实现

两种方法都编译运行通过,可以当做排序类直接使用. 折半插入排序: public class Sort1 { public static void main(String[] args) { InsertSort sort = new InsertSort(); sort.InsertSort(); int[] arr = sort.getarr(); System.out.println(); System.out.println("排序之后:"); for (int ar : arr

插入排序算法回顾(python实现)

插入排序的基本方法是:每步将一个待排序的记录按其关键字的大小插到前面已经排序的序列中的适当位置,直到全部记录插入完毕为止. 折半插入排序是对插入排序算法的一种改进,由于排序算法过程中,就是不断的依次将元素插入前面已排好序的序列中.由于前半部分为已排好序的数列,这样我们不用按顺序依次寻找插入点,可以采用折半查找的方法来加快寻找插入点的速度.具体操作为:在将一个新元素插入已排好序的数组的过程中,寻找插入点时,将待插入区域的首元素设置为a[low],末元素设置为a[high],则轮比较时将待插入元素与

【算法导论】插入排序

排序问题 输入:n个数的一个序列<a1, a2, ..., an> 输出:输入序列的一个排列<b1, b2, ..., bn>,满足 b1 ≤ b2 ≤ ... ≤ bn. 插入排序 对于插入排序,我们将其伪代码命名为Insertion-sort,其中的参数是一个数组A[1..n],包含长度为n的要排序的一个序列.(在代码中,A中元素的数目n用A.length来表示.)该算法原址排序输入的数:算法在数组A中重排这些数,在任何时候,最多只有其中的常数个数字存储在数组外面.在过程Ins

数据结构- 插入排序

插入排序 1.直接插入排序 void InsertSort(int *a, size_t size)//直接插入排序 { assert(a); for (size_t i = 0; i < size - 1; ++i) { int end = i; int tmp = a[end + 1]; while (end >= 0 && a[end]>tmp) { a[end + 1] = a[end]; --end; } a[end+1] = tmp; } } 2.希尔排序 /

LintCode_173 链表插入排序

题目 用插入排序对链表排序 样例 Given 1->3->2->0->null, return 0->1->2->3->null C++代码 ListNode *insertionSortList(ListNode *head) { // write your code here if (!head) return NULL; ListNode* root = head; head = head->next; root->next = NULL;

Python排序算法之直接插入排序

插入排序的主要思想是每次取一个列表元素与列表中已经排序好的列表段进行比较,然后插入从而得到新的排序好的列表段,最终获得排序好的列表. 比如,待排序列表为[49,38,65,97,76,13,27,49],则比较的步骤和得到的新列表如下: (带有背景颜色的列表段是已经排序好的,红色背景标记的是执行插入并且进行过交换的元素) 时间复杂度:O(n^2) 待排序:  [49,38,65,97,76,13,27,49] 第一次比较后:  [38,49,65,97,76,13,27,49]     第二个元

排序算法--插入排序

插入排序Insertion sort  插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕. 插入排序方法分直接插入排序和折半插入排序两种,这里只介绍直接插入排序,折半插入排序留到"查找"内容中进行. 图1演示了对4个元素进行直接插入排序的过程,共需要(a),(b),(c)三次插入.         static void insertion_sort(int[] unsorted)         {             for (int

算法导论学习之插入排序+合并排序

最近准备花时间把算法导论详细的看一遍,强化一下算法和数据结构的基础,将一些总结性的东西写到博客上去. 一.插入排序 算法思想:如果一个数组A,从A[1–n-1]都是有序的,然后我们将A[n]插入到A[1–n-1]的某个合适的位置上去那么就可以保证A[1–n]都是有序的.这就是插入排序的思想:具体实现的时候我们将数组的第一个元素看出有序,然后从第二个元素开始按照上面的步骤进行插入操作,直到插入最后一个元素,然后整个数组都是有序的了. 时间复杂度分析:代码中有两重for循环,很容易看出时间复杂度是n