排序算法
来源:互联网 发布:unity3d室内场景收费 编辑:程序博客网 时间:2024/06/03 21:25
1.直接插入排序
//直接插入排序 //基本思想:每次将一个待排序的记录插入到已经排好序的序列中 //时间复杂度:O(n2) //稳定性:稳定的 public static void insertSort(int array[]) { //第一个数看作排好序的序列,从第二个数开始寻找插入的位置 for(int i=1;i<array.length;i++) { //记录下当前待排序记录的值 int temp = array[i]; //往前扫描有序的序列,直到找到一个比当前记录值不大的位置 int j=i-1; for(;j>=0&&array[j]>temp;j--) { //把每个值向后移一位,给待排序的记录腾出位置 array[j+1]=array[j]; } array[j+1]=temp; } }
//选择排序 //基本思想:在一组待排序的序列中,选择一个最小的数和第一个位置的数交换,再从剩下的部分选择最小的数和第二个位置的交换,以此类推直到最后一个数 //时间复杂度:O(n2) //稳定性:不稳定的 public static void selectSort(int array[]) { for(int i=0;i<array.length;i++) { int position=i; //从待排序数组中找到最小的数,记录位置 for(int j=i+1;j<array.length;j++) { if(array[j]<array[position]) { position=j; } } //把最小的数交换到待排序数组的最前面去 int temp = array[i]; array[i]=array[position]; array[position]=temp; } }
3.快速排序
//快速排序 //基本思想:通过划分基准点,将数组分成两部分,左半部分全部小于基准点的值,右半部份全部大于基准点的值 //然后分别对两部分递归调用这个划分方法进行排序 //时间复杂度:O(nlogn) //稳定性:不稳定的 public static void quickSort(int array[],int left,int right) { if(left<right) { int keyposition = partition(array,left,right); quickSort(array,left,keyposition-1); quickSort(array,keyposition+1,right); } } public static int partition(int array[],int left,int right) { //选取最左边的元素作为基准点 int standard = array[left]; while(left<right) { //从最右边开始扫描,直到找到一个比基准点小的元素 while(left<right&&array[right]>=standard) { right--; } if(left<right) { array[left]=array[right]; left++; } //从左边开始扫描,直到找到一个比基准点大的元素 while(left<right&&array[left]<=standard) { left++; } if(left<right) { array[right]=array[left]; right--; } } array[left]=standard; return left; }
4.冒泡排序
//冒泡排序 //基本思想:从第一位开始,与后面的元素两两比较,每一轮把最小的冒到上面去 //时间复杂度:O(n2) //稳定性:稳定 public static void bubbleSort(int array[]) { for(int i=0;i<array.length;i++) { for(int j=i;j<array.length;j++) { if(array[i]>array[j]) { int temp =array[i]; array[i]=array[j]; array[j]=temp; } } } }
5.归并排序
//归并排序(二路归并) //基本思想:先把待排序的序列分成两部分,两部分各自继续分成两部分,直到分出来的部分只有一个元素,就按顺序合并两个部分 //时间复杂度:o(nlogn) //稳定性:稳定 public static void mergeSort(int array[],int start,int end,int temp[]) { if(start<end) { int mid = start+(end-start)/2; //递归获取排序好的左半边 mergeSort(array,start,mid,temp); //递归获取排序好的右半边 mergeSort(array,mid+1,end,temp); //左右合并 merge(array,start,mid,end,temp); } } //合并 public static void merge(int array[],int start,int mid,int end,int temp[]) { int i=start; int j=mid; int m=mid+1; int n=end; int k=0; //二路归并 //当任一半边的数组元素全部放到临时数组后就跳出循环 while(i<=j&&m<=n) { if(array[i]<array[m]) { temp[k++]=array[i++]; }else { temp[k++]=array[m++]; } } //处理剩下的数组元素 while(i<=j) { temp[k++]=array[i++]; } while(m<=n) { temp[k++]=array[m++]; } //把临时数组的元素按顺序拷贝到原目标数组中 for(i=0;i<k;i++) { array[start+i]=temp[i]; } }
0 0
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 编译时出现log4j2的配置文件没有导入错误
- 打造Redux中间件
- 使用Android Studio 2.2和Cmake (CMakeLists)让OpenCV 飞起来
- 按键控制单个数码管显示
- Android中判断应用运行时是否有网络连接并弹出对话框提示
- 排序算法
- 同一台系统下的用户进程之间的通信理解
- linux中expect的使用
- Computer Vision News
- JavaScript 常用函数
- 脚本收集 js的 addLoadEvent(func)函数
- Linux常用指令,很实用,适合初学者
- Nim游戏 博弈论
- 如果把充电宝的输入端和输出端短接会发生什么