标签:
思路:用递归,实现起来比较简单。
import java.util.*; public class Main { public static void main(String[] args) { int n, m; int[] s; Scanner in = new Scanner(System.in); n = in.nextInt(); s = new int[n+1]; for(int i = 1; i <= n; i++) s[i] = in.nextInt(); m = in.nextInt(); find(1, n, m, s); in.close(); } public static void find(int s, int e, int m, int[] st){ int index = (s + e) / 2; if(st[index] < m){ System.out.printf(st[index] + " "); find(index+1, e, m, st); }else if(st[index] > m){ System.out.printf(st[index] + " "); find(s, index-1, m, st); }else System.out.printf("%d\n%d\n", st[index], index); } }
import java.util.Scanner; public class Main { public static void main(String args[]) { Scanner in=new Scanner(System.in); int n = in.nextInt(); int[] array = new int[n + 1]; for(int i = 1; i <= n; i++) array[i] = in.nextInt(); adjust(array); print(array); heapSort(array); print(array); in.close(); } //输出 public static void print(int[] list) { System.out.print(list[1]); for (int i = 2; i < list.length; i++) { System.out.print(" " + list[i]); } System.out.println(); } //交换 public static void swap(int[] heap, int a, int b) { int temp = heap[a]; heap[a] = heap[b]; heap[b] = temp; } //根据定义,树节点前一半是有孩子的,所以,从这里开始调整 public static void adjust(int[] heap){ for (int i = heap.length / 2; i > 0; i--) adjust(heap, i, heap.length - 1); } public static void adjust(int[] heap,int i, int n) { int child; while (i <= n / 2) { child = i * 2; if(child + 1 <= n && heap[child] < heap[child + 1]) child += 1;//使child指向值较大的孩子 if(heap[i] < heap[child]){ swap(heap, i, child); //交换后,以child为根的子树不一定满足堆定义,所以从child处开始调整 i = child; } else break; } } //对一个最大堆heap排序 public static void heapSort(int[] heap) { for (int i = heap.length - 1; i > 0; i--) { //把根节点跟最后一个元素交换位置,调整剩下的n-1个节点,即可 swap(heap,1, i); adjust(heap,1, i - 1); } } }
import java.util.*; public class Main { //用于保存使用的支点记录 private static List<Integer> ans; public static void main(String[] args) { ans = new ArrayList<Integer>(); Scanner in = new Scanner(System.in); int n = in.nextInt(); int[] a = new int[n + 1]; for(int i = 1; i <= n; i++){ a[i] = in.nextInt(); } QuickSort(a, 1, n); //输出使用的支点记录 print_ans(); //输出排序后的值 print(a); in.close(); } public static void QuickSort(int[] R, int s, int t){ if(s < t){ int i = partition(R, s, t); ans.add(R[i]); QuickSort(R, s, i-1); QuickSort(R, i+1, t); } } public static int partition(int[] R, int s, int t){ int i = s, j = t; int x = R[s]; while(i < j){ //从右向左找小于x的数来填R[i] while(i < j && R[j] >= x) j--; if(i < j){ R[i] = R[j]; i++; } //从左向右找大于或等于x的数来填R[j] while(i < j && R[i] < x) i++; if(i < j){ R[j] = R[i]; j--; } } R[i] = x; return i; } public static void print(int[] R){ System.out.print(R[1]); for(int i = 2; i < R.length; i++){ System.out.print(" " + R[i]); } System.out.println(); } public static void print_ans(){ if(!ans.isEmpty()){ System.out.print(ans.get(0)); for(int i = 1; i < ans.size(); i++){ System.out.print(" " + ans.get(i)); } System.out.println(); } } }
试题4:希尔排序
希尔排序的思想是:先选择一个小于排序数据个数n的整数di(称为步长,一般为小于n的质数),将间隔di的数为一组,对每组的元素进行直接插入排序,即将需要排序的数据插入到已经排序好拢到序列中。当步长为1时,完成整个数据的排序。排序的流程为:
1、根据步长的个数,对于每个步长进行分组;
2、对每组进行插入排序,主要操作如下:
1)如果未有存在未有序的数据,将该数据存储到临时遍历R[0]中;
2)将前面比他大的数据全部向后移动一位;
3)再将R[0]的数据插入到最后移动到数据位置;
给你到问题是,将标准输入的n个整数采用希尔排序,步长取5,3,1,并需要显示出每次需要插入的数,并完成该数据的排序。
输入:标准输入,输入的第一行为整数的个数n值,第二行为n个整数,每个整数之 间为一个空格。
输出:标准输出,输出第一行依次输出排序过程中需要插入的数,每个输出数据之间使用一个空格隔开,第二行输出排序后的序列,每个输出数据之间使用一个空格隔开。
输入样例:
14
39 80 76 41 13 29 50 78 30 11 100 7 41 86
输出样例:
29 50 30 11 7 41 39 13 86 7 29 11 30 41 50 80 78
7 11 13 29 30 39 41 41 50 76 78 80 86 100
import java.util.*; public class Main { //用于保存每次需要插入的数 private static List<Integer> ans; public static void main(String[] args) { ans = new ArrayList<Integer>(); Scanner in = new Scanner(System.in); int n = in.nextInt(); int[] a = new int[n]; for(int i = 0; i < n; i++){ a[i] = in.nextInt(); } shellsort(a); //输出每次需要插入的数 print_ans(); //输出排序后的结果 print(a); in.close(); } public static void shellsort(int[] data) { int j = 0; int temp = 0; for (int increment = 5; increment > 0; increment -= 2) { for (int i = increment; i < data.length; i++) { temp = data[i]; boolean flag = true; for (j = i; j >= increment; j -= increment) { if(temp < data[j - increment]){ data[j] = data[j - increment]; if(flag) { ans.add(temp); flag = false; } }else break; } data[j] = temp; } } } public static void print(int[] R){ System.out.print(R[0]); for(int i = 1; i < R.length; i++){ System.out.print(" " + R[i]); } System.out.println(); } public static void print_ans(){ if(!ans.isEmpty()){ System.out.print(ans.get(0)); for(int i = 1; i < ans.size(); i++){ System.out.print(" " + ans.get(i)); } System.out.println(); } } }
标签:
原文地址:http://blog.csdn.net/qq_21899803/article/details/51789677