1、冒泡排序
/**冒泡排序算法冒泡排序算法的运作如下:(从后往前)比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。*/import java.util.Scanner;public class Test12{public static void main(String[] args){int[] nums = {34,4,56,56,90,65};//待排序的数列//外循环控制轮数for(int i=0;i<nums.length-1;i++){ //比较轮数等于数列的长度-1for(int j=0;j<nums.length-1-i;j++){if(nums[j]>nums[j+1]){nums[j] = nums[j]+nums[j+1];nums[j+1] = nums[j]-nums[j+1];nums[j] = nums[j]-nums[j+1];}}}//输出结果for(int n : nums){System.out.println(n);}}}/*34 4 56 17 90 654 34 17 56 65 90 //第一轮 5次4 17 34 56 65 //第二轮 4次4 17 34 56 //第三轮 3次4 17 34 //第四轮 2次4 17 //第五轮 1次*/
2、选择排序
/**选择排序算法每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。选择排序是不稳定的排序方法。*/import java.util.Scanner;public class Test13{public static void main(String[] args){int[] nums = {34,4,56,17,90,65};//待排序的数列int minIndex = 0;//用于记录每次比较的最小值下标//控制轮数for(int i=0;i<nums.length-1;i++){minIndex = i;//每轮假设一个最小值下标for(int j=i+1;j<nums.length;j++){if(nums[minIndex]>nums[j]){minIndex = j;}}//判断需要交换的数下标是否为自己if(minIndex!=i){nums[minIndex] = nums[minIndex]+nums[i];nums[i] = nums[minIndex]-nums[i];nums[minIndex] = nums[minIndex]-nums[i];}}//输出结果:for(int n: nums){System.out.println(n);}}}/*34 4 56 17 90 654 34 56 17 90 65 第一轮 5次4 17 56 34 90 65 第二轮 4次4 17 34 56 90 65 第三轮 3次4 17 34 56 90 65 第四轮 2次4 17 34 56 65 90 第五轮 1次*/
3、插入排序
/**直接插入排序算法(从后向前找到合适位置后插入)基本思想:每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的子序列的合适位置(从后向前找到合适位置后),直到全部插入排序完为止。*/import java.util.Scanner;public class Test14{public static void main(String[] args){int[] nums = {34,4,56,17,90,65};//待排序的数列//控制比较的轮数:for(int i=1;i<nums.length;i++){int temp = nums[i]; //记录操作数int j = 0;for(j=i-1;j>=0;j--){if(nums[j]>temp){nums[j+1] = nums[j];}else{break;}}if(nums[j+1]!=temp){nums[j+1] = temp;}}//输出结果:for(int n : nums){System.out.println(n);}}}/*34 4 56 17 90 65temp=4第一轮:i=1,4要插到34前,就要把34往后挪,变为34,34,56,17,90,65再从temp中拿到数:4,34,56,17,90,65temp=56第二轮:i=2,56>34,直接退出:4,34,56,17,90,65temp=17第三轮:i=3 4,34,56,56,90,654,34,34,56,90,654,17,34,56,90,65temp=90第四轮:i=4,90>57,直接退出temp=65第五轮:i=5 4,17,34,56,90,904,17,34,56,65,90*/
4、二分查找
/**二分法查找(折半查找):前提是在已经排好序的数组中,通过将待查找的元素与中间索引值对应的元素进行比较,若大于中间索引值对应的元素,去右半部分查找,否则,去左半部分查找。依此类推。直到找到为止;找不到返回一个负数。*/import java.util.Scanner;public class Test15{public static void main(String[] args){//必须保正数列是有序的int[] num = {10,20,50,65,88,90};int index = binarySearch(num,88);System.out.println(index);}//二分查找算法public static int binarySearch(int[] num,int key){int start = 0;//开始下标int end = num.length-1;//结束下标while(start<=end){int middle = (start+end)/2; //>>>1if(num[middle]>key){end = middle-1;}else if(num[middle]<key){start = middle+1;}else{return middle;}}return -1;}}
5、归并排序
MergeSort(归并排序)算法Java实现 - 九天高远 - 博客园 (cnblogs.com)

算法主要思想
template<class T>void merge( T r[],T r2[],int s,int mid,int t)//s为第一个子表首元素的下标,mid为第一个子表末元素的下标//t为第二个子表末元素的下标{ int i,j,k;i=s;j=mid+1;k=s; //k是r2的初始指针while((i<=mid)&&(j<=t)){ k=k+1;if(r[i].key<=r[j].key){r2[k]=r[i];i++;}else{r2[k]=r[j];j++;}}while(i<=mid){k++;r2[k]=r[i];i++;}while(j<=t){k++;r2[k]=r[j];j++;}} //merge
Java实现的二路归并排序的算法如下
package com.chang;import java.util.Arrays;public class myMergeSort {public static void main(String[] args) {int[] li={26, 5, 98, 108, 28, 99, 100, 56, 34, 1};printArray("排序前:",li);guiBingSort(li);printArray("排序后:",li);}private static void printArray(String pre,int[] a) {System.out.print(pre+"\n");for(int i=0;i<a.length;i++)System.out.print(a[i]+"\t");System.out.println();}public static void guiBingSort(int[] li){System.out.println("开始排序");mergeSort(li,0,li.length-1);}public static void mergeSort(int[] li,int l,int r){if(l==r){return;}int mid=l+((r-l)>>1);//二路归并排序里面有两个Sort,多路归并排序里面写多个Sort就可以了mergeSort(li,l,mid);mergeSort(li,mid+1,r);merge(li,l,mid,r);}static int number=0;public static void merge(int[] li, int left ,int mid,int right){//暂存数组int[] temp=new int[li.length];int tIndex=left;int cIndex=left;int r1=mid+1;while(left<=mid && r1<=right){if(li[left]<=li[r1]){temp[tIndex++]=li[left++];}else{temp[tIndex++]=li[r1++];}}while(left<=mid){temp[tIndex++]=li[left++];}while(r1<=right){temp[tIndex++]=li[r1++];}System.out.println("第"+(++number)+"趟排序:\t");//将暂存数组中的内容拷贝到原数组while(cIndex<=right){li[cIndex]=temp[cIndex];//输出中间归并排序结果System.out.print(li[cIndex]+"\t");cIndex++;}System.out.println("");}}/*排序前:26 5 98 108 28 99 100 56 34 1开始排序第1趟排序:5 26第2趟排序:5 26 98第3趟排序:28 108第4趟排序:5 26 28 98 108第5趟排序:99 100第6趟排序:56 99 100第7趟排序:1 34第8趟排序:1 34 56 99 100第9趟排序:1 5 26 28 34 56 98 99 100 108排序后:1 5 26 28 34 56 98 99 100 108*/
