`
阅读更多
交换排序:
1.冒泡排序
public static void bubble(int arr[]){
		for(int i=1;i<arr.length;i++){//控制次数
			for(int j=0;j<arr.length-i;j++){//控制当前比较到那个位置
				if(arr[j]>arr[j+1]){
					swap(arr,j,j+1);
				}
			}
		}
	}



2.快排
	public static void quickSort(int a[],int left,int right){
		int i;
		if(left<right){
			i=partition(a,left,right);
			quickSort(a,left,i-1);
			quickSort(a,i+1,right);
		}
	}
	
	public static int partition(int a[],int left,int right){
		int base = a[left];
		while(left<right){
			while(left<right && a[right]>=base) {--right;}
			a[left] = a[right];
			while(left<right && a[left]<=base)  {++left;}
			a[right] = a[left];
		}
		a[left] = base;//a[right]=base;  right==left;
		return left;
	}


选择排序
1.直接选择

	public static void select(int a[]){
		int index;
		for(int i=0;i<a.length-1;i++){
			index = i;
			for(int j=i+1;j<a.length;j++){
				if(a[j]<a[index]){
					index = j;
				}
			}
			if(index!=i){
				swap(a,index,i);
			}
		}
	}


2.堆排序

public static void  heap(int[] data)
	{
		int n = data.length;
		for(int i=n/2-1;i>=0;i--){//从中间有叶子节点的数据开始
			 keepHeap(data,i,n);
		}
		while (n > 0) {
		  swap(data, 0, n-1);//把第一个和本次建堆的最后一个交换
		  keepHeap(data, 0,--n);//排除最后一个继续建堆
		}
	}
	
	/**
	 * 建(大/小顶)堆操作
	 * @param r
	 * @param index 本次建堆的起始下标
	 * @param length 本次建堆的数据长度
	 */
	 private static void keepHeap(int[] r, int index,int length) {
		 int x = r[index];
		 int j = 2 * index + 1;
		 while (j < length ) {//注意是: 下标 < 长度(不是 下标<最长的下表)
		 if (j < length - 1 && r[j] < r[j + 1])//判断是否存在右节点,且和左节点比较大小
		    ++j;
		 if (r[j] > x) {
		    r[index] = r[j];//上面小的变成下面大的
		    index = j;
		    j = 2 * index + 1; //继续向下
		   }else{
			   break;
		   }
		 }
		 r[index] = x;
	}


插入排序

1.直接插入排序

public static void insert(int a[]){
		for(int i=1;i<a.length;i++){
			int t = a[i];
			int j = i-1;
			while(j>=0 && t<a[j]){
				a[j+1] = a[j];
				j--;
			}
			a[j+1] = t;
		}
		
	}


2.折半插入排序

	public static void halfInsert(int a[]){
		for(int i=1;i<a.length;i++){
			int t = a[i];
			int big = i-1, small = 0;
			while(big>=small){
				int mid = (big+small)/2;
				if(a[mid]<t){
					small = mid+1;
				}else{
					big = mid-1;
				}
			}
			//(i-1)->small 数值 均向前移动一位 
			for(int j=i;j>small;j--){
				a[j] = a[j-1];
			}
			a[big+1] = t;
		}
	}


3.希尔排序
方法1.

	public static void shell(int a[]){
		for(int span=a.length/2;span>=1;span--){
			for(int i=span;i<a.length;i++){
				int tmp = a[i];
				int j = i-span;
				while(j>=0 && a[j]>tmp){
					a[j+span] = a[j];
					j -= span;
				}
				a[j+span] = tmp;
			}
		}
	}


方法2:

	public static  void  shell2(Number[] data)
	{
		int span=data.length/7;
		if(span==0)span=1;
		while(span>=1){
			for(int i=0;i<span;i++){
				for(int j=i;j<data.length;j=j+span){
					//组内直接插入排序	
					int p = j-span;
					Number temp = data[j];
					while( p >=0 && data[p].doubleValue() > temp.doubleValue()){
						data[p+span] = data[p];
						p -=span;
					}
					data[p + span] = temp;
				}
			}
			span=span/2;
		}
	}




方法1和2的微妙之处,至于1是在span之内先增加i,遇到块便向后查询
2是先循环一个块上的数据来排序,然后在span之内在递增
二者最外层都是在缩小span;
解释的不是很清楚,需要阅读代码
其他:

归并排序
/** 
	* 分治和归并 
	* @param a 
	* @param low 
	* @param high 
	* @param b 
	*/ 
    public static void mergeSort(int a[],int low,int high,int b[]){
    	int mid;
    	if(low<high){
    		mid = (low+high)/2;//分治位置 
    		mergeSort(a, low, mid, b);
    		mergeSort(a,mid+1,high,b);
    		merge(a,low,mid,high,b);//归并 
    	}
    }
    
    
    /** 
     * 合并两个有序子序列 
     * @param a 
     * @param low 
     * @param mid 
     * @param high 
     * @param b 辅助数组 
     */ 
    public static void merge(int a[],int low,int mid,int high,int b[]){
    	int i = low;
    	int j = mid+1;
    	int p = 0;
    	while(i<=mid&&j<=high){
    		b[p++] = (a[i]<=a[j])?a[i++]:a[j++];
    	}
    	//如果子序列1没有合并完则直接复制到辅助数组中去 
    	//复制low mid段未被copy的部分
    	while(i<=mid){
    		b[p++] = a[i++];
    	}
    	//如果子序列2没有合并完则直接复制到辅助数组中去 
    	//复制mid+1 high段未被copy的部分
    	while(j<=high){
    		b[p++] = a[j++];
    	}
    	
    	//把辅助数组的元素复制到原来的数组中去 
    	//复制b[0 ~ p-1]到a[low ~ high]
    	for(p=0,i=low;i<=high;i++,p++){
    		a[i] = b[p];
    	}
    }


基数排序

暂无



本文参照了网上一些文章,对此如有版权问题,请与我联系,放在这里主要是为了共同学习。
分享到:
评论

相关推荐

    堆排序7.java 使用java实现的堆排序

    堆排序7.java 使用java实现的堆排序堆排序7.java 使用java实现的堆排序堆排序7.java 使用java实现的堆排序堆排序7.java 使用java实现的堆排序堆排序7.java 使用java实现的堆排序堆排序7.java 使用java实现的堆排序堆...

    java实现归并排序

    Java实现归并排序 Java 实现归并排序是一种常用的排序算法,通过分治策略将原始数组分成小组,然后对每个小组进行排序,最后将排序好的小组合并成一个有序数组。下面是 Java 实现归并排序的知识点总结: 基本思想 ...

    快排序的Java实现

    本篇将详细讲解如何使用Java实现快速排序。 首先,理解快速排序的步骤至关重要。快速排序的主要步骤包括: 1. **选择枢轴元素(Pivot Selection)**:在待排序的数组中选取一个元素作为枢轴,通常选择第一个或最后...

    Java实现六种常用排序(含源代码)

    Java实现六种常用排序 并用多线程进行速度比较(其实意义不大) 含有代码

    Java语言实现六种排序算法

    Java实现冒泡排序的关键在于两个for循环,外层控制遍历次数,内层用于相邻元素的比较和交换。 2. 选择排序(Selection Sort) 选择排序每次找出未排序部分的最小(或最大)元素,然后将其与未排序部分的第一个元素...

    Java 实现 11 种排序算法

    Java作为广泛应用的编程语言,提供了丰富的工具来实现各种排序算法。本文将深入探讨标题中提到的11种排序算法,每一种都有其独特的特性和适用场景。 1. **冒泡排序**:是最基础的排序算法之一,通过不断交换相邻的...

    JAVA 8种排序介绍及实现

    Java实现如下: ```java public class InsertSort { public void sort(int[] a) { int temp; for (int i = 1; i ; i++) { int j = i - 1; temp = a[i]; for (; j &gt;= 0 && temp [j]; j--) { a[j + 1] = a[j];...

    Java实现拖拽列表项的排序功能

    总结一下,Java实现拖拽列表项的排序功能主要包括以下步骤: 1. 启用UI组件的拖放功能,如设置`AllowDrop`、`CanReorderItems`和`IsSwipeEnabled`属性。 2. 监听并处理拖放事件,更新数据模型以反映拖放操作。 3. ...

    Java实现二叉排序树

    在Java中实现二叉排序树,我们通常会定义一个`Node`类来表示树的节点,它包含键、值以及左右子节点的引用。例如: ```java class Node { int key; Object value; Node left, right; public Node(int item) { ...

    Java 实现ip 地址排序

    Java ip 地址排序Java ip 地址排序Java ip 地址排序Java ip 地址排序

    文件按照window 的排序规则-Java实现

    在Java编程环境中,我们也可以模拟实现这种排序规则。Java提供了丰富的类库和方法来处理文件操作,包括对文件的排序。以下是关于如何在Java中实现Windows文件排序规则的详细解释: 1. **文件对象的创建**: 在Java...

    各种排序算法比较(java实现)

    `Algorithm.java`文件可能包含了这些排序算法的Java实现代码,而`常见排序算法的实现与性能比较.doc`文档则可能详细比较了这些算法的性能和适用场景。`readme.txt`文件可能是对整个项目的简要说明,包括如何运行和...

    堆排序12.java 使用java代码实现

    堆排序12.java 使用java代码实现堆排序12.java 使用java代码实现堆排序12.java 使用java代码实现堆排序12.java 使用java代码实现堆排序12.java 使用java代码实现堆排序12.java 使用java代码实现堆排序12.java 使用...

    堆排序10.java 使用java来实现

    堆排序10.java 使用java来实现堆排序10.java 使用java来实现堆排序10.java 使用java来实现堆排序10.java 使用java来实现堆排序10.java 使用java来实现堆排序10.java 使用java来实现堆排序10.java 使用java来实现堆...

    java实现冒泡排序

    在实际编程中,Java还提供了其他的排序算法实现,如`Arrays.sort()`方法,它是基于快速排序和插入排序的混合算法,性能优于冒泡排序,适用于大多数情况。然而,理解并实现冒泡排序有助于初学者掌握排序算法的基本...

    Java实现八大排序算法

    在这里,我们将深入探讨Java实现的八大排序算法,包括冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序、堆排序以及计数排序。 1. **冒泡排序(Bubble Sort)**:冒泡排序是一种简单直观的排序算法,...

    Java实现堆排序

    Java实现堆排序不是C,Java实现堆排序不是C,Java实现堆排序不是C,Java实现堆排序不是C

    java 语言三种排序 程序

    Java作为一种广泛使用的面向对象的语言,提供了多种方法来实现排序。本篇文章将详细探讨Java中实现插入排序、冒泡排序和选择排序的原理、代码实现及它们的时间和空间复杂度。 首先,我们来看插入排序。插入排序是一...

    Java实现计数排序

    Java实现计数排序不是C,Java实现计数排序不是C,Java实现计数排序不是C

    基于java实现的10种基本排序方式

    用java实现了10种基础排序,其内容包括: 1.冒泡排序 2.选择排序 3.插入排序 4.快速排序 5.希尔排序 6.归并排序 7.堆排序 8.桶排序 9.基数排序 10.计数排序 如有疑问请私信我

Global site tag (gtag.js) - Google Analytics