标签:
思路:用递归,实现起来比较简单。
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