- import javax.mail.Part;
- /**
- * 顺序查找、排序
- *
- * @author 曾修建
- * @version 创建时间:2014-7-30 下午04:15:10
- */
- public class SequentialSearch {
- public static void main(String[] args) {
- Integer[] a = {1,2,3,4,5,7,6,88};
- //二分查找非递归
- System.out.println( "二分查找非递归实现 位置 : "+ Binary_Seach(a,0));
- //二分查找递归实现
- System.out.println("二分查找递归实现 :" +Binary(a,0,a.length,1));
- //插值查找
- System.out.println(" 插值查找位置 : "+Insert_Search(a,3));
- //斐波拉契查找
- //稠密索引 (家里放的东西记录到笔记本上)/
- //分块索引(图书馆的书)
- //倒排索引
- Integer[] a_sort = {1,33,3,14,5,71,6,88};
- //希尔排序
- Shell_Sort(a_sort);
- //冒泡排序
- Bubble_Sort(a_sort);
- //插入排序
- Insert_Sort(a_sort);
- //简单选择排序
- Select_Sort(a_sort);
- //快速排序
- Quick_Sort(a_sort);
- //堆排序
- Heap_Sort(a_sort);
- //归并排序
- Merge_Sort(a_sort);
- for (int i = 0; i < a.length; i++) {
- if (a[i]==8) {
- System.out.println("找到了");
- }
- }
- int i=0;
- if (a[0]==1) {
- System.out.println("找到了");
- //return 0;
- }
- a[0]=1;
- while (a[i]!=1) {
- i++;
- }
- //return i;
- }
- //堆排序
- public static void Heap_Sort(Integer[] array) {
- // 对数组进行筛选,建成一个大顶堆
- double len = array.length - 1;
- for (int i = (int) Math.floor(len/2); i > 0; i--) {
- heapAdjust(array, i, array.length - 1);
- }
- for (int i = array.length - 1; i > 0; i--) {
- // 将堆顶元素与最后一个元素调换位置,即输出最大值
- // swap(array, 1, i);
- int temp;
- temp = array[1];
- array[1] = array[i];
- array[i] = temp;
- // 将最后一位剔出,数组最大下标变为i-1。自队顶至叶子进行调整,形成一个新堆,此过程称为筛选
- heapAdjust(array, 1, i - 1);
- }
- System.err.println();
- System.err.println("堆排序 :");
- for (int i = 1; i < array.length; i++) {
- System.err.print(array[i] + " ");
- }
- }
- // 建堆函数,认为【s,m】中只有 s
- // 对应的关键字未满足大顶堆定义,通过调整使【s,m】成为大顶堆=====================================================
- public static void heapAdjust(Integer[] array, int s, int m) {
- // 用0下标元素作为暂存单元
- array[0] = array[s];
- // 沿孩子较大的结点向下筛选
- for (int j = 2 * s; j <= m; j *= 2) {
- // 保证j为较大孩子结点的下标,j < m 保证 j+1 <= m ,不越界
- if (j < m && array[j] < array[j + 1]) {
- j++;
- }
- if (!(array[0] < array[j])) {
- break;
- }
- // 若S位较小,应将较大孩子上移
- array[s] = array[j];
- // 较大孩子的值变成S位的较小值,可能引起顶堆的不平衡,故对其所在的堆进行筛选
- s = j;
- }
- // 若S位较大,则值不变;否则,S位向下移动至2*s、4*s、。。。
- array[s] = array[0];
- }
- // 交换函数=====================================================
- public static void swap(Integer[] array, int i, int j) {
- int temp;
- temp = array[i];
- array[i] = array[j];
- array[j] = temp;
- }
- //归并排序
- public static void Merge_Sort(Integer []a) {
- if (a.length>0) {
- M_Sort(a,a,0,a.length-1);
- }
- System.err.println();
- System.err.println("归并排序 : ");
- for (int i = 0; i < a.length; i++) {
- System.err.print(a[i]+" ");
- }
- }
- //归并排序实现
- public static void M_Sort(Integer []a,Integer []td, int low , int high) {//拆分
- int mid ;
- Integer [] td2 = new Integer[a.length];
- if (low == high) {
- td[low] = a[high];
- }
- else {
- mid =(low+high)/2;
- M_Sort(a, td2, low, mid);
- M_Sort(a, td2, mid+1, high);
- Merge(a, td, low, mid, high);
- }
- }
- //归并排序合并
- public static void Merge(Integer []a , Integer []td ,int low , int mid, int high) {
- int m , n , k;
- for ( m = low ,n = mid ,k=low ; m < mid && n < high ; k++) {
- td[k] = a[m] < a[n] ? a[m++]:a[n++];
- }
- if (m < mid) {
- for (int i = 0; i < mid-m; i++) {
- td[k+i] = a[m+i];
- }
- }
- if (n<high) {
- for (int i = 0; i < high-n; i++) {
- td[k+i] = a[n+i];
- }
- }
- System.err.println();
- System.err.println("归并排序 : ");
- for (int i = 0; i < td.length; i++) {
- System.err.print(td[i]+" ");
- }
- }
- //快速排序
- public static void Quick_Sort(Integer a[]) {
- if (a.length>0) {
- Sort(a,0,a.length-1);
- }
- System.err.println();
- System.err.println("快速排序 : ");
- for (int i = 0; i < a.length; i++) {
- System.err.print(a[i]+" ");
- }
- }
- //快排实现
- public static void Sort(Integer []a, int low, int high) {
- if (low<high) {
- int position = Part(a , low , high);
- Sort(a, low, position-1);
- Sort(a, position+1, high);
- }
- }
- //快排方法
- public static int Part(Integer []a,int low , int high){
- int i = low , j = high ,po = a[low];
- while (i<j) {
- while (i<j && po < a[j]) {
- j--;
- }
- a[i] = a[j];//比中轴小的记录移到低端
- while (i<j && po >a[i]) {
- i++;
- }
- a[j] = a[i];//比中轴大的记录移到高端
- }
- // a[low] =po; //中轴记录到尾
- return i;
- }
- //简单选择排序
- public static void Select_Sort(Integer []a) {
- for (int i = 0; i < a.length; i++) {
- int min =i;
- for (int j = i+1; j < a.length; j++) {
- if (a[min] > a[j]) {
- min = j;
- }
- }
- if (min!=i) {
- int temp = a[min];
- a[min] = a[i];
- a[i] = temp;
- }
- }
- System.err.println();
- System.err.println("简单选择 : ");
- for (int i = 0; i < a.length; i++) {
- System.err.print(a[i]+" ");
- }
- }
- //插入排序
- public static void Insert_Sort(Integer []a) {
- for (int i = 1; i < a.length; i++) {
- if (a[i]<a[i-1]) {
- for (int j = i; j >=0; j--) {
- if (a[i]<a[j]) {
- int temp = a[i];
- a[i] = a[j];
- a[j] = temp;
- }
- }
- }
- }
- System.err.println();
- System.err.println("插入 : ");
- for (int i = 0; i < a.length; i++) {
- System.err.print(a[i]+" ");
- }
- }
- //希尔排序
- public static void Shell_Sort(Integer []a) {
- int step =a.length;
- do {
- step = step/3+1;
- for (int i = step+1; i < a.length; i++) {
- if (a[i]<a[i-step]) {
- int temp = a[i];
- a[i] = a[i-step];
- a[i-step] =temp;
- }
- }
- } while (step>1);
- System.err.println();
- System.err.println("希尔 : ");
- for (int i = 0; i < a.length; i++) {
- System.err.print(a[i]+" ");
- }
- }
- //冒泡排序
- public static void Bubble_Sort(Integer []a ) {
- for (int i = 1; i < a.length; i++) {
- for (int j = a.length-1; j >=i; j--) {
- if (a[j]<a[j-1]) {
- int temp = a[j];
- a[j] = a[j-1];
- a[j-1] = temp;
- }
- }
- }
- System.err.println();
- System.err.println("冒泡 : ");
- for (int i = 0; i < a.length; i++) {
- System.err.print(a[i]+" ");
- }
- }
- //插值查找
- public static int Insert_Search(Integer []a , int k) {
- int low = 0 , high = a.length-1 , mid=-1;
- while (low<=high) {
- mid = low+((k-a[low])/(a[high]-a[low]))*(high-low);
- if (a[mid] == k) {
- return mid;
- }
- else if (a[mid] > k) {
- high = mid-1;
- }
- else {
- low = mid+1;
- }
- }
- return -1;
- }
- //递归实现二分查找
- public static int Binary(Integer []a , int low , int high ,int k) {
- int mid = (low+high)/2;
- if (a[mid] == k) {
- return mid;
- }
- else if (a[mid] > k) {
- return Binary(a, low , mid-1, k);
- }
- else {
- return Binary(a, mid + 1, high, k);
- }
- }
- //非递归实现二分查找
- public static int Binary_Seach(Integer[] a , int k){
- int low = 0 , high = a.length , mid=-1;
- while (low<=high) {
- mid = (low+high)/2;
- if (a[mid]==k) {
- return mid;
- }
- else if (a[mid]>k) {
- high = mid-1;
- }
- else {
- low = mid+1;
- }
- }
- return -1;
- }
- }
所有的排序、查找算法
最新推荐文章于 2024-09-27 11:17:47 发布