交换类
冒泡排序
public void maopaosort(int[] a) { // TODO Auto-generated method stub for(int i=a.length-1;i>=0;i--) { for(int j=0;j<i;j++) { if(a[j]>a[j+1]) { int team=a[j]; a[j]=a[j+1]; a[j+1]=team; } } }}
快速排序
public void quicksort(int [] a,int left,int right){ int low=left; int high=right; //下面两句的顺序一定不能混,否则会产生数组越界!!!very important!!! if(low>high)//作为判断是否截止条件 return; int k=a[low];//额外空间k,取最左侧的一个作为衡量,最后要求左侧都比它小,右侧都比它大。 while(low<high)//这一轮要求把左侧小于a[low],右侧大于a[low]。 { while(low<high&&a[high]>=k)//右侧找到第一个小于k的停止 { high--; } //这样就找到第一个比它小的了 a[low]=a[high];//放到low位置 while(low<high&&a[low]<=k)//在low往右找到第一个大于k的,放到右侧a[high]位置 { low++; } a[high]=a[low]; } a[low]=k;//赋值然后左右递归分治求之 quicksort(a, left, low-1); quicksort(a, low+1, right); }
插入类
直接插入排序
public void insertsort (int a[]){ int team=0; for(int i=1;i<a.length;i++) { System.out.println(Arrays.toString(a)); team=a[i]; for(int j=i-1;j>=0;j--) { if(a[j]>team) { a[j+1]=a[j]; a[j]=team; } else { break; } } } }
希尔排序
public void shellsort (int a[]){ int d=a.length; int team=0;//临时变量 for(;d>=1;d/=2)//共分成d组 for(int i=d;i<a.length;i++)//到那个元素就看这个元素在的那个组即可 { team=a[i]; for(int j=i-d;j>=0;j-=d) { if(a[j]>team) { a[j+d]=a[j]; a[j]=team; } else { break; } } } }
选择类
简单选择排序
public void selectSort(int[] arr) { for (int i = 0; i < arr.length - 1; i++) { int min = i; // 最小位置 for (int j = i + 1; j < arr.length; j++) { if (arr[j] < arr[min]) { min = j; // 更换最小位置 } } if (min != i) { swap(arr, i, min); // 与第i个位置进行交换 } }}private void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp;}
堆排序
static void swap(int arr[],int m,int n){ int team=arr[m]; arr[m]=arr[n]; arr[n]=team;}//下移交换 把当前节点有效变换成一个堆(小根)static void shiftDown(int arr[],int index,int len)//0 号位置不用{ int leftchild=index*2+1;//左孩子 int rightchild=index*2+2;//右孩子 if(leftchild>=len) return; else if(rightchild<len&&arr[rightchild]<arr[index]&&arr[rightchild]<arr[leftchild])//右孩子在范围内并且应该交换 { swap(arr, index, rightchild);//交换节点值 shiftDown(arr, rightchild, len);//可能会对孩子节点的堆有影响,向下重构 } else if(arr[leftchild]<arr[index])//交换左孩子 { swap(arr, index, leftchild); shiftDown(arr, leftchild, len); }}//将数组创建成堆static void creatHeap(int arr[]){ for(int i=arr.length/2;i>=0;i--) { shiftDown(arr, i,arr.length); }}static void heapSort(int arr[]){ System.out.println("原始数组为 :"+Arrays.toString(arr)); int val[]=new int[arr.length]; //临时储存结果 //step1建堆 creatHeap(arr); System.out.println("建堆后的序列为 :"+Arrays.toString(arr)); //step2 进行n次取值建堆,每次取堆顶元素放到val数组中,最终结果即为一个递增排序的序列 for(int i=0;i<arr.length;i++) { val[i]=arr[0];//将堆顶放入结果中 arr[0]=arr[arr.length-1-i];//删除堆顶元素,将末尾元素放到堆顶 shiftDown(arr, 0, arr.length-i);//将这个堆调整为合法的小根堆,注意(逻辑上的)长度有变化 } //数值克隆复制 for(int i=0;i<arr.length;i++) { arr[i]=val[i]; } System.out.println("堆排序后的序列为:"+Arrays.toString(arr));}