面试中重要的排序算法
来源:互联网 发布:皇室战争烈焰精灵数据 编辑:程序博客网 时间:2024/05/16 04:44
/** * 二分查找,找不到则返回一。 * @param a * @param key * @return */public static int binarySearch(int[] a,int key){ int low =0,high=a.length-1; while (low<=high) { int mid = (low+high)/2; if (a[mid] == key) return mid; else if (a[mid] < key) low =mid+1; else high = mid-1; } return -1;}public static void sort(int[] a, int left, int right) { if (left >= right) return; int center = (left + right) >> 1; sort(a, left, center); sort(a, center + 1, right); merge(a, left, center, right);}public static void merge(int[] data, int i, int m, int n) { int[] tmpArr = new int[n]; int j,k; for (j = m+1, k=i; i<=m&&j<=n ; k++) { if (data[i] > data[j]) tmpArr[k] = data[j++]; else tmpArr[k] = data[i++]; } while (i<=m) tmpArr[k++]=data[i]; while (j<=n) tmpArr[k++] = data[j]; } public static void Msort(int[] sr,int s,int t){ if (s==t) return; if(s<=t){ int m= (s+t)/2; Msort(sr,s,m); Msort(sr,m+1,t); merge(sr,s,m,t); } }/** * 建堆(从(n-1)/2开始调整堆的结构) * @param a * @param n */public static void heapSort(int[] a,int n){ for (int i = n/2-1; i >=0 ; i--) { adjustHeapDown(a,i,n); }}/** * 调整堆(从第i个结点开始向下调整) * @param a * @param n */public static void adjustHeapDown(int[] a,int i,int n){ int tmp = a[i]; int j =2*i+1; while (j<n) { if ((j + 1) < n && a[j + 1] < a[j]) j = j + 1; //如果最小的子节点比根节点的值小,交换父节点和子节点的值,在往下调整子节点 if (a[j] < tmp) { a[i] = a[j]; i = j; j = 2 * i + 1; } else break;//若子节点的值比父节点的值,本来就是小根堆,同时说明树的子结构也满足要求,因此不需要继续往下调整。 } a[i] = tmp;}/** * 调整堆(从第i个结点开始向下调整) * @param a * @param n */public static void deleteFromHeap(int[] a,int i,int n){ a[0] = a[n-1];//把最后一个元素复制到堆顶,开始往下调整 for (int j = 0; j <n-1 ; j++) { adjustHeapDown(a,0,n-1); } }/** * 快速排序 * @param a * @param low 数组的下边界 * @param high 数组的上边界 */public static void quickSort(int[] a,int low,int high){ if (low<high) { int index = getQuickIndex(a,low,high); quickSort(a,low,index-1); quickSort(a,index+1,high); }}/** * 得到每次快排的索引 * @param a * @param low * @param high * @return */public static int getQuickIndex(int[] a,int low,int high){ int tmp = a[low]; int i = low,j=high; while (i<j) { while (a[j] >tmp && i < j) j--; if (i < j) { a[i] = a[j]; i++; } while (a[i] <= tmp && i < j) i++; if (i < j) { a[j] = a[i]; j--; } } a[i]=tmp; return i;}/** * 插入排序 * @param a * @param n */public static void zhiJieSort(int[] a,int n){ int j; for (int i = 1; i <n ; i++) { for (j = 0; j < i; j++) { //在有序的元素中找到第一个比当前大的 if (a[j] > a[i]) { break; } } //j到i-1的元素往后移动 if (j != i) { int tmp = a[i]; for (int k = i - 1; k >= j; k--) { a[k + 1] = a[k]; } a[j] = tmp; } }}/** * 选择排序 * @param a * @param n */public static void choiceSort(int[] a,int n){ for (int i = 0; i <n ; i++) { int mini = i; for (int j = i+1; j <n ; j++) { if (a[j]<a[mini]) mini=j; } if (mini!=i){ int tmp = a[i]; a[i]=a[mini]; a[mini]=tmp; } }}/** * 冒泡排序 * @param a * @param n */public static void bubleSort(int[] a,int n){ boolean flag = true; for (int i = 0; i <n&&flag ; i++) { flag=false; for (int j = 1; j <n-i ; j++) { if (a[j-1]<a[j]) { int tmp = a[j]; a[j]= a[j-1]; a[j-1]=tmp; flag=true; } } printArray(a,8); System.out.println(""); }}public static void printArray(int[] a,int n){ for (int i = 0; i <n ; i++) { System.out.print(a[i]+" "); }}
0 0
- 面试中重要的排序算法
- 总结数据结构中重要的排序算法
- java面试中常用的排序算法
- java面试中常用的排序算法
- 笔试面试中常见的排序算法
- java面试中常用的排序算法
- java面试中常用的排序算法
- 面试中常见的排序算法
- 一些重要的排序算法
- 面试中排序算法问题
- 面试中排序算法问题
- 总结的比较重要的排序算法
- 排序算法的重要评价标准
- 排序算法重要知识点
- 面试中 各种排序算法实现
- 面试常见排序算法(中)
- 计算机编程中一些重要的算法
- 计算机编程中一些重要的算法
- Managing DbContext the right way with Entity Framework 6: an in-depth guide
- ABP入门系列(13)——Redis缓存用起来
- Ubuntu安装汇编器as86和链接器ld86
- TIFF图像数据的排列方式的装换
- 简单的Makefile编写
- 面试中重要的排序算法
- 初探Javascript
- 定时刷新之轮播图
- C++--第二次作业
- 《Ray Tracing from the Ground Up》中的坐标系是怎么确定的
- 在路上前行的小牛
- vector
- 网络流(Network Flow)
- Problem F: 质心算法