常见排序算法

本贴最后更新于 2057 天前,其中的信息可能已经东海扬尘

冒泡排序

public int[] bubbleSort(int[] a){ if(a == null ||a.length==0) { return a; } for(int i = 0;i<a.length-1;i++) { for(int j = i+1;j<a.length;j++) { if(a[i] > a[j]) { Util.Util.swap(a,i,j); } } } return a; } //感觉不是很正宗呢 -.- //两个循环+一个交换

选择排序

package sort; public class Selection_sort { public int[] sort(int[] a){//不断的挑选出未排序的最小的数 for (int i=0;i<a.length-1;i++) { int flag = a[i]; int minindex = i; for (int j = i+1;j<a.length;j++) { if(a[j] < a[minindex]) { minindex = j; } } Util.Util.swap(a,i,minindex); } return a; } }

快速排序

package sort; import Util.Util; //分割数组,一边小于pivot,一边大于pivot,然后进行递归 public class quickSort { //得调用递归,之前不用递归出不来... public int[] sort(int[] a,int low,int high){ if(low<high) { int index = partition(a,low,high); sort(a,low,index-1); sort(a,index+1,high); } return a; } public int partition(int[] a,int low,int high) { int pivot = a[low]; while(low<high) { while(low<high && pivot <= a[high]) { high--; } a[low] = a[high];//由于有个副本pivot,所以直接覆盖了 while(low<high && pivot >= a[low]){ low++; } a[high] = a[low]; } a[low] = pivot; return low; } }

直接插入排序

package sort; import Util.Util; public class insertionSort { //插入排序也是一种思想很简单的排序方法, // 它通过比较当前元素和其之前已排好序的元素的大小, // 找到合适的位置插入,并把插入位置后的元素往后移动。 public int[] sort(int[] a) { for (int i = 1;i<a.length;i++) { int now = a[i]; int index = i; for(int j = i;j>=1;j--) { if(now < a[j-1]) { a[j] = a[j-1]; index = j-1; } } a[index] = now; } return a; } } //把向后移动的代码改成交换的代码也是可以实现排序的

希尔排序

package sort; public class ShellSort { //和直接插入排序差不多,只是多了步长,并不断减少步长 public int[] sort(int[] a) { int section = a.length/2; while(section>=1) { for(int i = section;i<a.length;i++) { int now = a[i]; int index = i; for(int j = i-section;j>=0;) { if(now < a[j]) { a[j+section] = a[j]; index = j; } j = j-section; } a[index] = now; } section = section/2; } return a; } }

归并排序

package sort; //主要是合并的函数起到排序的作用,利用两个指针进行排序 public class MergeSort { public int[] sort(int[] a,int left,int right) { if(left < right) { int mid = (left+right)/2; sort(a,left,mid); sort(a,mid+1,right); merge(a,left,mid,right); } return a; } public void merge(int[] a, int left, int mid, int right) { int[] temp = new int[right-left+1]; int i = left; int j = mid+1; int t = 0;//临时数组指针 while(i<=mid&&j<=right) { if(a[i] < a[j]) { temp[t++] = a[i++]; }else{ temp[t++] = a[j++]; } } while(i<=mid) { temp[t++] = a[i++]; } while(j<=right) { temp[t++] = a[j++]; } t = 0; while(left<=right) a[left++] = temp[t++]; } }

堆排序

package sort; import Util.Util; //0开始的数组,子节点是2*下标+1,2*下标+2 //找到子节点中最大的数,然后和父节点比较大小并交换 public class HeapSort { public int[] sort(int[] a) { for(int i = a.length/2-1;i>=0;i--) //a.length/2-1是最后一个父节点的位置 { HeapAdjust(a,i,a.length-1); } for(int i = a.length-1;i>=0;i--) { Util.swap(a,0,i); HeapAdjust(a,0,i-1); } return a; } public void HeapAdjust(int[] a,int l,int h) { int temp = a[l]; for(int j = 2*l+1;j<=h;j=j*2+1)//得到子节点的最大值 { if(j+1 <=h && a[j] < a[j+1]) { j++; } if(temp < a[j]) { a[l] = a[j]; l = j; } } a[l] = temp; } }

其他排序还有 桶排序,计数排序,基数排序(都是非比较排序),想偷懒就不写了 👅

  • 算法
    429 引用 • 254 回帖 • 24 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...