1.交换排序
1.1冒泡排序
工作原理:
1)比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
3)针对所有的元素重复以上的步骤,除了最后一个。
4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
代码实现:
import java.util.Random;
public class zongjie {
public static void paixu(int a[]){
for (int i = 1; i <a.length ; i++) {
for (int j = 0; j <a.length-i ; j++) {
if(a[j]>a[j+1]){
int t=a[j+1];
a[j+1]=a[j];
a[j]=t;
}
}
}
for(int i:a){
System.out.printf("%3d",i);
}
System.out.println();
}
public static void main(String[] args) {
Random ra=new Random();
int a[]=new int[10];
for (int i = 0; i <a.length ; i++) {
a[i]=ra.nextInt(20);
}
System.out.println("排序前");
for(int i:a){
System.out.printf("%3d",i);
}
System.out.println();
System.out.println("排序后");
paixu(a);
}
}
1.2快速排序
工作原理:
在要排的数(比如数组A)中选择一个中心值key(比如A[0]),通过一趟排序将数组A分成两部分,其中以key为中心,key右边都比key大,key左边的都key小,然后对这两部分分别重复这个过程,直到整个有序。
整个快排的过程就简化为了一趟排序的过程,然后递归调用就行了。
一趟排序的方法:
1,定义i=0,j=A.lenght-1,i为第一个数的下标,j为最后一个数下标
2,从数组的最后一个数Aj从右往左找,找到第一小于key的数,记为Aj;
3,从数组的第一个数Ai 从左往右找,找到第一个大于key的数,记为Ai;
4,交换Ai 和Aj
5,重复这个过程,直到 i=j
6,调整key的位置,把A[i] 和key交换
假设要排的数组为:A[8] ={ 5 2 8 9 2 3 4 9 }
选择 key = 5, 开始时 i=0,j=7
index 0 1 2 3 4 5 6 7
开始: 5 2 8 9 2 3 4 9
i j
第一次找 5 2 8 9 2 3 4 9
i j
交换: 5 2 4 9 2 3 8 9
i j
第二次找 5 2 4 9 2 3 8 9
i j
交换: 5 2 4 3 2 9 8 9
i j
第三次找 5 2 4 3 2 9 8 9
ij
调整key: 2 5 4 3 5 9 8 9
ij
代码实现:
public class paixu{
private static void kuaipai(int[] a, int low, int high) {
//1,找到递归算法的出口
if( low > high) {
return;
}
//2, 存
int i = low;
int j = high;
//3,key
int key = a[ low ];
//4,完成一趟排序
while( i< j) {
//4.1 ,从右往左找到第一个小于key的数
while(i<j && a[j] > key){
j--;
}
// 4.2 从左往右找到第一个大于key的数
while( i<j && a[i] <= key) {
i++;
}
//4.3 交换
if(i<j) {
int p = a[i];
a[i] = a[j];
a[j] = p;
}
}
// 4.4,调整key的位置
int p = a[i];
a[i] = a[low];
a[low] = p;
//5, 对key左边的数快排
kuaipai(a, low, i-1 );
//6, 对key右边的数快排
kuaipai(a, i+1, high);
}
public static void main(String[] args){
int a[]=new int[]{4,5,1,9,3,7,4};
System.out.println("排序前");
for(int i:a)
System.out.printf("%3d",i);
System.out.println();
kuaipai(a,0,6);
System.out.println("排序后");
for(int i:a)
System.out.printf("%3d",i);
}
}
2插入排序
2.1简单插入排序
工作原理:
1、从第一个元素开始,该元素可以认为已经被排序。
2、取出下一个元素,在已经排序的元素序列中从后向前扫描。
3、如果该元素(已排序)大于新元素,则将该元素移到下一位置。
4、重复步骤3,直到找到已排序的元素小于或者大于新元素的位置。
5、将新元素插入到该位置。
6、重复步骤2。
代码实现:
public class zongjie {
public static void charu(int a[]) {
// 从数组的第二个元素开始循环将数组中的元素插入
for (int i = 1; i < a.length; i++) {
// 设置数组中的第2个元素为第一次循环要插入的数据
int x = a[i];
int j = i - 1;
for (; j >= 0 && a[j] > x; j--) {
a[j + 1] = a[j];
}
// 直到要插入的元素不小于第j个元素,将insertNote插入到数组中
a[j + 1] = x;
}
}
public static void main(String[] args) {
int a[]={5,7,9,1,2,0,6,1,7,9,10,3};
System.out.println("排序前");
for(int i:a) System.out.printf("%3d",i);
System.out.println();
System.out.println("排序后");
charu(a);
for(int i:a) System.out.printf("%3d",i);
}
}
2.2希尔排序
3选择排序
3.1简单选择排序
工作原理:
1)首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置
2)再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
3)重复第二步,直到所有元素均排序完毕。
代码实现:
public class zongjie {
public static void xuanzhe(int a[]) {
int min;
for (int i = 0; i <a.length-1 ; i++) {
min=i;
for (int j = i+1; j <a.length ; j++) {
if(a[min]>a[j])min=j;
}
if(min!=i){
int t=a[min];
a[min]=a[i];
a[i]=t;
}
}
}
public static void main(String[] args) {
int a[]={5,7,9,1,2,0,6,1,7,9,10,3};
System.out.println("排序前");
for(int i:a) System.out.printf("%3d",i);
System.out.println();
System.out.println("排序后");
xuanzhe(a);
for(int i:a) System.out.printf("%3d",i);
}
}
折半查询
工作原理:
折半查找又称为二分查找,其要求是数列经过排序的。对于没有经过排序的数列对其进行排序后,然后进行折半查找操作。
譬如数组{1,2, 3, 4, 5, 6, 7, 8, 9},查找元素6,用二分查找的算法执行的话,其顺序为:
1).第一步查找中间元素,即5,由于5<6,则6必然在5之后的数组元素中,那么就在{6, 7, 8, 9}中查找,
2)寻找{6, 7, 8, 9}的中位数,为7,7>6,则6应该在7左边的数组元素中,那么只剩下6,即找到了。
二分查找算法就是不断将数组进行对半分割,每次拿中间元素和目标数据进行比较。
代码实现:
import java.util.Scanner;
public class zongjie {
public static int zheban(int a[],int x) {
int left=0;
int right=a.length-1;
int mid;
while(left<=right){
mid=(left+right)/2;
if(a[mid]==x)return mid;
else if(a[mid]<x)left=mid+1;
else right=mid-1;
}
return -1;
}
public static void main(String[] args) {
int a[]={1,2,3,4,5,6,7,8,9,10};
Scanner sc=new Scanner(System.in);
System.out.println("输入待查找的数");
int x=sc.nextInt();
System.out.println(zheban(a,x));
}
}