//插入排序 package InsertionSort; import java.util.Vector; import java.util.Scanner; public class InsertionSort { Scanner scn=new Scanner(System.in); Vector<Double> v=new Vector<Double>(); public static void main(String[] args) { // TODO Auto-generated method stub InsertionSort s=new InsertionSort(); System.out.print("请输入要排序的数以空格区分:"); String array = s.scn.nextLine(); String[] arraySort=array.split(" "); for(int i=0;i<arraySort.length;++i) s.v.add(Double.parseDouble(arraySort[i])); s.scn.close(); s.Sort(); System.out.print("排序后的数列为:"); for(int i=0;i<s.v.size();++i) System.out.print(s.v.get(i).toString()+" "); } public InsertionSort(){ } public InsertionSort(Vector<Double> v){ this.v=v; } public void Sort(){ for(int i=1;i<v.size();++i){ int j=i-1; double key=v.get(i); while(j>=0 && v.get(j)>key){ v.set(j+1, v.get(j)); --j; } v.set(j+1, key); } } } /* 写出针对这个问题的线性查找的伪代码,它顺序地扫描整个序列以查找V。 利用循环不变式证明算法的正确性。确保所给出的循环不变式满足三个必要的性质。 伪代码如下: LINEAR-SEARCH(A,V) flag←0 for i←1 to length[A] do if A[i]==V then print i flag←1 if flag==0 then print NIL 循环不变式的证明如下: 初始化:首先,先来证明在第一轮迭代之前,它是成立的。 此时,flag初始化为0,表示未找到这样一个小标i,使得A[i]=V.若为1,则表示已找到一个或多个这样的下标。 那么,很显然,在还未开始之前flag=0是正确的,也就证明了循环不变式在循环的第一轮迭代开始之前是成立的。 保持:接下来证明每一轮循环都能使循环不变式保持成立。 我们看到,在第一个for循环体内,随着i逐个从1到遍历完整个数列的过程中,只要有一个下标i,使得A[i]等于V,那么在输出i的同时,将flag重新标记为1,表示已找到。 无论接下来是否还有这样满足条件的i出现,flag的值不变,仍为1,反之,若遍历完之后,没有找到这样的一个i,那么flag在这个for循环中未做任何改变,仍为0。 所以,循环不变式的第二个性质也成立。 终止:对此线性查找算法来说,当i大于length[A]的值(即遍历完整个A数列后),for循环结束。 这时,如果flag未改变(即flag=0),则说明未能找到这样的下标i,输出NIL;反之,若已在for循环中被修改为1,则不会运行此步语句,这也就意味着该算法是正确的。 */
//二路归并排序 package MergeSort; import java.util.Scanner; import java.util.Vector; public class MergeSort { Scanner scn=new Scanner(System.in); Vector<Double> v=new Vector<Double>(); public static void main(String[] args) { // TODO Auto-generated method stub MergeSort s=new MergeSort(); System.out.print("请输入要排序的数以空格区分:"); String array = s.scn.nextLine(); String[] arraySort=array.split(" "); for(int i=0;i<arraySort.length;++i) s.v.add(Double.parseDouble(arraySort[i])); s.scn.close(); s.Sort(1,s.v.size()); System.out.print("排序后的数列为:"); for(int i=0;i<s.v.size();++i) System.out.print(s.v.get(i).toString()+" "); } public void Merge(int p,int q,int r) { int pl=0; int pr=0; Vector<Double> L=new Vector<Double>(); Vector<Double> R=new Vector<Double>(); for(int i=0;i<q-p+1;++i) L.add(v.get(p+i-1)); L.add(Double.MAX_VALUE); for(int i=0;i<r-q;++i) R.add(v.get(q+i)); R.add(Double.MAX_VALUE); for(int i=p-1;i<r;++i){ if(L.get(pl)<R.get(pr)){ v.set(i, L.get(pl)); ++pl; } else{ v.set(i, R.get(pr)); ++pr; } } } public void Sort(int p,int r) { if(p<r){ int q=(r+p)/2; Sort(p,q); Sort(q+1,r); Merge(p,q,r); } } }