java:排序算法代码

package com.sort;

/*选择排序
 * 每一轮比较得出一个最小值
*/
public class ChoseSort
{
	//对数组进行从小到大排序
	public static void sort(int[] arr)
	{
		for(int i = 0; i < arr.length - 1; i++) //当前元素
		{
			for(int j = i+1; j < arr.length; j++)  //和它后面的元素进行比较,得出最小值
			{
				if(arr[i] > arr[j])
				{
					int tmp = arr[i];
					arr[i] = arr[j];
					arr[j] = tmp;
				}
			}
		}
		
	}
	
	//打印数组
	public static void print(int[] arr)
	{
		for(int i = 0; i < arr.length; i++)
		{
			System.out.print(arr[i] + " ");
		}
		
		System.out.println();
	}
	
	
	
	public static void main(String[] args)
	{
		int[] arr = {4,6,1,9,3,5};
		sort(arr);
		
		print(arr);
	}

}

<pre name="code" class="java">package com.sort;

/*冒泡排序
 * 
 * 相邻两元素进行比较,大的元素往后放,每一轮遍历得出一个最大值
 * */

public class PopSort 
{
	//冒泡排序
	public static void sort(int[] arr)
	{
		for(int i = 0; i < arr.length -1; i++)  //比较的次数
		{
			for(int j = 0; j < arr.length - 1 - i; j++)  //当前元素与它后面的元素比较
			{
				if(arr[j] > arr[j+1])
				{
					int tmp = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = tmp;
				}
			}
		}
			
	}
	
	//打印数组
	public static void print(int[] arr)
	{
		for(int i = 0; i < arr.length; i++)
		{
			System.out.print(arr[i] + " ");
		}
		
		System.out.println();
	}
	
	public static void main(String[] args)
	{
		int[] arr = {5,3,1,9,8,2};
		sort(arr);
		
		print(arr);

	}
}


 
<pre name="code" class="java">package com.sort;

/*
 * 插入排序,如同插纸牌
 * */

public class InsertSort 
{
	//插入排序
	public static void sort(int[] arr)
	{
		for(int i = 1; i < arr.length; i++)   //从第二个元素开始遍历
		{
			int tmp = arr[i];  //保存当前要插入的元素
			int j = i-1;  //从当前位置的前一个位置开始,从后往前
			 
			while(j >= 0 && arr[j] > tmp)  //从下标i-1开始从后往前,大于arr[i]的元素右移一位
			{
				arr[j+1] = arr[j];
				j--;
			}
			
			arr[j+1] = tmp;  //arr[i]填在空位上
		}
	}

	//打印数组
	public static void print(int[] arr)
	{
		for(int i = 0; i < arr.length; i++)
		{
			System.out.print(arr[i] + " ");
		}
		
		System.out.println();
	}
	
	public static void main(String[] args)
	{
		int[] arr = {6,1,2,9,8,7};
		sort(arr);
		
		print(arr);
	}
}



package com.sort;


/*
 * 快速排序:
 *  1.先从数列中取出一个数作为基准数
 *  2.分区:根据该基准值,把比该基准值大的数放在右边,比基准值小的数放在左边
 *  3.重复前两步,直到每个区间只剩一个元素
 * */

public class FastSort 
{
//快速排序,参数:arr:数组, low:数组区域的最小下标,high:数组区域的最大下标
public static void sort(int[] arr, int low, int high)
{
if(low >= high)   //如果区域里只剩一个元素,退出
{
return;
}

int i = low;  //记录最小下标
int j = high;  //记录最大下标

int index = arr[i];  //把区域的第一个元素作为基准值

//分两路遍历---从前往后,从后往前,按基准值分区
while(i < j)
{
//从后往前遍历,找到元素arr[j] < 基准值
while(i < j && arr[j] >= index)
{
j --;
}
if(i < j)  //arr[j]补在arr[i]位置上
{
arr[i] = arr[j];
i++;
}

//从前往后遍历,找到元素arr[i] > 基准值
while(i < j && arr[i] < index)
{
i ++;
}
if(i < j)  //arr[i]补在arr[j]位置上
{
arr[j] = arr[i];
j--;
}

arr[i] = index;  //基准值补在arr[i]位置上

sort(arr, low, i-1);  //递归的对分区元素排序
sort(arr, i+1, high);

}
}

//打印数组
public static void print(int[] arr)
{
for(int i = 0; i < arr.length; i++)
{
System.out.print(arr[i] + " ");
}

System.out.println();
}

public static void main(String[] args)
{
int[] arr = {9,2,1,8,6,7};
sort(arr, 0, arr.length-1);

print(arr);
}


}
 

package com.sort;

/*
 * 归并排序:
 * 
 *1.递归的进行折半,将一个数组分成两个数组A,B
 *2.如果两个数组都是有序的,则可以很容易把它们合并成一个数组
 *3.怎样保证两个数组是有序的呢?当每个数组中只有一个元素时,可以认定它们是有序的
 * */

public class GuibingSort 
{
	//合并两个有序数列arr[first,mid],(mid,end]
	public static void merge(int[] arr, int first, int mid, int end)
	{
		//分别保存arr[first,mid]和(mid,end]
		int[] A = new int[mid-first+1];
		int[] B = new int[end-mid];
		
		//用A保存arr[first,mid]
		for(int i = first,j = 0; i <= mid; i++)
		{
			A[j++] = arr[i];
		}
		
		//用B保存arr(mid,end]
		for(int i = mid+1, j = 0; i <= end; i++)
		{
			B[j++] = arr[i];
		}
		
		//将有序数组A,B进行合并成arr[first,end]
		int i = 0;
		int j = 0;
		int k = first;
		
		//遍历数组A、B,逐一比较,将较小的元素存放在arr中
		while(i < A.length && j < B.length)
		{
			if(A[i] <= B[j])
			{
				arr[k++] = A[i++];
			}
			else
			{
				arr[k++] = B[j++];
			}
		}
		
		//数组A、B剩下的片段,加入arr中
		if(i < A.length)
		{
			for(int m = i; m < A.length; m++)
			{
				arr[k++] = A[m];
			}
		}
		
		if(j < B.length)
		{
			for(int m = j; m < B.length; m++)
			{
				arr[k++] = B[m];
			}
		}
	}
	
	//打印数组
	public static void print(int[] arr)
	{
		for(int i = 0; i < arr.length; i++)
		{
			System.out.print(arr[i] +" ");
		}
		
		System.out.println();
	}
	
	//归并排序
	public static void mergeSort(int[] arr, int first, int end)
	{
		if(first < end)  //当数组序列中的元素个数大于1时(也就是说:递归的终止条件是,每个序列中只有一个元素)
		{
			int mid = (first + end) / 2; //递归折半
			mergeSort(arr, first, mid);
			mergeSort(arr, mid+1, end);
			merge(arr, first, mid, end); //合并
		}
	}
	
	
	public static void main(String[] args)
	{
		int[] arr = new int[]{5, 1, 7, 3, 9, 0};
		
		mergeSort(arr, 0, arr.length-1);
		
		print(arr);
	}

}


package com.sort;

/*希尔排序:(缩小增量排序)
 * 1.根据步长对数组元素进行分组
 * 2.每组内的元素进行插入排序
 * 3.步长逐渐减小,当步长为1时,进行插入排序后,完成排序
 * 出发点:插入排序对基本有序的数组,效率较高
 * */

public class ShellSort
{
	//希尔排序
	public static void ShellSort(int[] arr)
	{
		//gap:分组的步长,在这规定步长每组减半
		for(int gap = arr.length / 2; gap > 0; gap /= 2)
		{
			for(int i = 0; i < gap; i++)  //每一组内进行插入排序
			{
				for(int j = i + gap; j < arr.length; j += gap)
				{
					int tmp = arr[j];
					int k = j - gap;
					
					while(k >= 0 && arr[k] > tmp)
					{
						arr[k+gap] = arr[k];
						k -= gap;
					}
					
					arr[k+gap] = tmp;
				}
			}	
			
		}
			
	}
	
	//打印数组
	public static void print(int[] arr)
	{
		for(int i = 0; i < arr.length; i++)
		{
			System.out.print(arr[i] +" ");
		}
		
		System.out.println();
	}
	
	
	public static void main(String[] args)
	{
		int[] arr = new int[]{3, 8, 2, 5, 9, 0};
		
		ShellSort(arr);
		
		print(arr);
	}

}


package com.sort;

/*堆排序,从大到小排序
 * 1.把一位数组构建成堆,父节点大于左右儿子节点,第0节点为最小元素节点
 * 2.第0节点与最后一个节点交换,就得到了最小元素,然后在堆序列化
 * 3.重复2
 * */

public class heapSort 
{
	//构建堆
	public static void buildHeap(int[] arr)
	{
		int len = arr.length;  //数组元素个数
		
		for(int i = len/2 - 1; i >= 0; i--)
		{
			heapify(arr, i, len-1);
		}
	}
	
	//堆化数组arr[],i为当前元素下标,n为元素个数
	public static void heapify(int[] arr, int i, int n)
	{
	    int temp = arr[i];  
	    int j = 2 * i + 1;  //左孩子
	    while (j < n)  
	    {  
	        if (j + 1 < n && arr[j + 1] < arr[j]) //如果有右孩子,在左右孩子中找最小的  
	            j++;  
	  
	        if (arr[j] >= temp)  //如果最小的孩子都比它小,退出循环
	            break;  
	        else        //与最小的孩子交换
	        {
	            arr[i] = arr[j];     //把较小的子结点往上移动,替换它的父结点  
		        i = j;  
		        j = 2 * i + 1; 	
	        }
	     
	    }  
	    
	    arr[i] = temp;  
	}
	
	//堆排序
	public static void HeapSort(int[] arr)
	{
		buildHeap(arr);
		
		for(int i = arr.length - 1; i >= 0; i--)
		{
			int tmp = arr[0];    //第0元素为最小元素,交换到最后面
			arr[0] = arr[i];
			arr[i] = tmp;
			
			heapify(arr, 0, i-1);  //数组堆序列换,次小元素升至0位置
		}
	}
	
	
	//打印数组
	public static void print(int[] arr)
	{
		for(int i = 0; i < arr.length; i ++)
		{
			System.out.print(arr[i] +" ");
		}
		
		System.out.println();
	}
	
	public static void main(String[] args)
	{
		int[] arr = {5,4,9,8,7,6,0,1,3,2};
		print(arr);
		
		//构建堆
		buildHeap(arr);
		print(arr);
		
		HeapSort(arr);
		print(arr);
	}

}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值