简单插入排序
package lxq.java.sort;
public class InsertSort {
public static void insertSort(Integer[] arr){
int i,j;
for(i=2;i<=arr.length-1;i++){
//要插入 的元素小于前面最后一个元素,说明当然元素必须插入到前面合适的位置去
if(arr[i]<arr[i-1]){
arr[0]=arr[i];
//不需要加j>=1的判断,因为当arr[i]比前面的都小时,最后会比较arr[0]>arr[0]
for(j=i-1;arr[j]>arr[0];j--){
arr[j+1]=arr[j];
}
arr[j+1]=arr[0];
}
}
}
public static void main(String[] args) {
//0号位置留作哨兵之用,注意只是数组最大下标为length-1
Integer[] arr=new Integer[]{null,49,38,65,97,76,13,27,49,55,04};
insertSort(arr);
System.out.println("插入排序执行结果如下:");
for(int i=1;i<=arr.length-1;i++){
System.out.print(arr[i]+" ");
}
System.out.println();
}
}
选择排序
package lxq.java.sort;
//冒泡排序每一次从剩下所有的元素中找出最小的比较
public class SelectionSort {
public static void selectionSort(Integer[] arr){
//imin记录最小值,index记录最小值的下标,tmp用于交换的临时变量
int i,j,imin,index,tmp;
for(i=1;i<arr.length-1;i++){
imin=arr[i];
index=i;
for(j=i+1;j<=arr.length-1;j++){
if(arr[j]<imin){
imin=arr[j];
index=j;
}
}
tmp=arr[i];
arr[i]=arr[index];
arr[index]=tmp;
}
}
public static void main(String[] args) {
//0号位置留作哨兵之用,注意只是数组最大下标为length-1
Integer[] arr=new Integer[]{null,49,38,65,97,76,13,27,49,55,04};
selectionSort(arr);
System.out.println("选择排序执行结果如下:");
for(int i=1;i<=arr.length-1;i++){
System.out.print(arr[i]+" ");
}
System.out.println();
}
}
冒泡排序
package lxq.java.sort;
//冒泡排序每一次只是相邻的两个元素比较,注意j必须从大到小才能保证冒泡
public class BubbleSort {
public static void bubbleSort(Integer[] arr){
int i,j,tmp;
for(i=1;i<arr.length-1;i++){
for(j=arr.length-1;j>i;j--){
if(arr[j]<arr[j-1]){
tmp=arr[j];
arr[j]=arr[j-1];
arr[j-1]=tmp;
}
}
}
}
public static void main(String[] args) {
//0号位置留作哨兵之用,注意只是数组最大下标为length-1
Integer[] arr=new Integer[]{null,49,38,65,97,76,13,27,49,55,04};
bubbleSort(arr);
System.out.println("冒泡排序执行结果如下:");
for(int i=1;i<=arr.length-1;i++){
System.out.print(arr[i]+" ");
}
System.out.println();
}
}
希尔排序
package lxq.java.sort;
//希尔排序的一趟排序类似与插入排序,只是增量不一样
public class ShellSort {
public static void shellSort(Integer[] arr,int dk){
int i,j;
for(i=dk+1;i<=arr.length-1;i++){
//要插入 的元素小于前面最后一个dk元素,说明当然元素必须插入到前面合适的位置去
if(arr[i]<arr[i-dk]){
arr[0]=arr[i];
for(j=i-dk;j>=1&&arr[j]>arr[0];j-=dk){
arr[j+dk]=arr[j];
}
arr[j+dk]=arr[0];
}
}
}
public static void main(String[] args) {
//0号位置留作哨兵之用,注意只是数组最大下标为length-1
Integer[] arr=new Integer[]{null,49,38,65,97,76,13,27,49,55,04};
Integer[] dlta=new Integer[]{5,3,1};//增量
for(int i=0;i<dlta.length;i++){
shellSort(arr,dlta[i]);
}
System.out.println("希尔排序执行结果如下:");
for(int i=1;i<=arr.length-1;i++){
System.out.print(arr[i]+" ");
}
System.out.println();
}
}
快速排序
package lxq.java.sort;
public class QuickSort {
public static int partition(Integer[] arr,int low,int high){
arr[0]=arr[low];
while(low<high){
while(low<high&&arr[high]>=arr[0]){
high--;
}
arr[low]=arr[high];
while(low<high&&arr[low]<=arr[0]){
low++;
}
arr[high]=arr[low];
}
arr[low]=arr[0];
return low;
}
public static void quickSort(Integer[] arr,int low,int high){
if(low<high){
int parloc=partition(arr,low,high);
quickSort(arr,low,parloc-1);
quickSort(arr,parloc+1,high);
}
}
public static void main(String[] args) {
//0号位置留作哨兵之用,注意只是数组最大下标为length-1
Integer[] arr=new Integer[]{null,49,38,65,97,76,13,27,49,55,04};
quickSort(arr,1,arr.length-1);
System.out.println("快速排序执行结果如下:");
for(int i=1;i<=arr.length-1;i++){
System.out.print(arr[i]+" ");
}
System.out.println();
}
}
归并排序
package lxq.java.sort;
public class MergeSort {
public static void merge(Integer[] arr,int s,int m,int t){
int i,j,k;
Integer[] res=new Integer[t-s+1];//根据arr中要合并的长度申请临时数组的长度
for(i=s,j=m+1,k=0;i<=m&&j<=t;k++){
if(arr[i]<arr[j]){
res[k]=arr[i++];
}
else{
res[k]=arr[j++];
}
}
while(i<=m){
res[k]=arr[i++];
k++;
}
while(j<=t){
res[k]=arr[j++];
k++;
}
for(k=s;k<=t;k++){//临时数组存放的数据是从0开始的哦
arr[k]=res[k-s];
}
}
public static void mergeSort(Integer[] arr,int s,int t){
if(s==t){
return;
}
else{
int m=(s+t)/2;
mergeSort(arr,s,m);
mergeSort(arr,m+1,t);
merge(arr,s,m,t);
}
}
public static void main(String[] args) {
//0号位置留作哨兵之用,注意只是数组最大下标为length-1
Integer[] arr=new Integer[]{null,49,38,65,97,76,13,27,49,55,04};
mergeSort(arr,1,arr.length-1);
System.out.println("归并排序执行结果如下:");
for(int i=1;i<=arr.length-1;i++){
System.out.print(arr[i]+" ");
}
System.out.println();
}
}
堆排序
package lxq.java.sort;
public class HeapSort {
public static void heapAdjust(Integer[] arr,int adjustIndex,int length){
int adjustValue=arr[adjustIndex];
int i;
for(i=2*adjustIndex;i<=length;i*=2){//沿值较小的孩子节点向下筛选
if(i+1<=length&&arr[i+1]<arr[i]) i++;
if(adjustValue<=arr[i]) break;//已经符合则退出
arr[adjustIndex]=arr[i];//将孩子节点的小值赋给父节点,孩子节点的值暂时不变,等到下次孩子节点的孩子节点赋值给它或等到筛选结束时赋值给它
adjustIndex=i;
}
arr[adjustIndex]=adjustValue;//在最后的位置上赋值最开始要筛选的值,就完成本次筛选
}
public static void heapSort(Integer[] arr){
for(int i=(arr.length-1)/2;i>=1;i--){//把数组arr[1,arr.length-1]建成小顶堆
heapAdjust(arr,i,arr.length-1);
}
for(int i=arr.length-1;i>1;i--){
int tmp=arr[1];//将堆顶记录和当前arr[1,i]中最后一个记录相互交换
arr[1]=arr[i];
arr[i]=tmp;
heapAdjust(arr,1,i-1);//将arr[1,i-1]重新调整为小顶堆,也即对堆顶元素进行一次筛选
}
}
public static void main(String[] args) {
//0号位置留作哨兵之用,注意只是数组最大下标为length-1
Integer[] arr=new Integer[]{null,49,38,65,97,76,13,27,49,55,04};
heapSort(arr);
System.out.println("堆排序执行结果如下:");
for(int i=arr.length-1;i>=1;i--){
System.out.print(arr[i]+" ");
}
System.out.println();
}
}