快速排序
原理:
通过设定一个关键字将序列分成小于关键字和大于关键字的两部分,在将前后两部分迭代来排序
代码(借鉴):
package net.hncu.d0728;
/**
* 快速排序:指定一个关键字,循环把小于关键字的移到左边
* 原理:
* @author Administrator
*
*/
public class QuickSort {
public static void main(String[] args) {
int[] a = {6,4,9,3,8,5,2};
quickSort(a,0,a.length-1);
for(int i=0;i<a.length;i++) {
System.out.print(a[i]+", ");
}
}
private static void quickSort(int[] arrays,int start,int end) {
int i = start;
int j= end;
int value=arrays[i];
if(start>=end) //如果start>=end证明迭代完成了,排序也就完成了
return;
boolean flag = true;//往前往后的开关
while(i!=j) {
if(flag) {
if(value>arrays[j]) {//每次从最后找到比关键字小的数与关键字交换,这样比关键字小的数就都到了关键字前面
swap(arrays,i,j);
flag=false;
}else {
j--;
}
}else {
if(value<arrays[i]) {//同理
swap(arrays,i,j);
flag=true;
}else{
i++;
}
}
}
quickSort(arrays,start,j-1);//从关键字所在的位置分成前后两段继续迭代
quickSort(arrays,i+1,end);
}
private static void swap(int[] arrays,int i,int j) {
int temp=arrays[i];
arrays[i]=arrays[j];
arrays[j]=temp;
}
}
冒泡排序:
private static void bubbleSort(int[] a) {
for(int i=0;i<a.length-1;i++) {
for(int j=0;j<a.length-i-1;j++) {
if(a[j]>a[j+1]) {
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
优化后的选择排序:
//选择优化:减少交换次数
private static void selectionSort(int[] a) {
for(int i=0;i<a.length-1;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;
}
}
}
插入排序:
private static void insertSort(int[] a) {
for(int i=0;i<a.length;i++) {
for(int j=i;j>0;j--) {
if(a[j+1]<a[j]) {
int temp=a[j+1];
a[j+1]=a[j];
a[j]=temp;
}else {
break;
}
}
}
}
二分查找法:
private static void binarySearch(int[] a, int x) {
int start = 0;
int end = a.length - 1;
int key;
while (start <= end) {
key = (start + end) / 2;
if (x > a[key]) {
start = key;
} else if (x < a[key]) {
end = key;
} else {
System.out.println("x的位置是:" + (key + 1));
break;
}
}
}