@rxq
选择排序:可以说是一种简单直观的排序算法,但是不稳定。工作原理就是,每一次从待排序的数据元素中找出最小或最大的一个元素,放在序列的起始位置,以此类推,直到全部数据元素排完。
希尔排序:又称为缩小增量排序。通过某个增量将数组元素划分为若干组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的数组元素越来越多,当增量减至1时,整个数组元素恰被分成一组,算法便终止。
二分查找:就是将查找的键和子数组的中间键作比较,如果被查找的键小于中间键,就在左子数组继续查找;如果大于中间键,就在右子数组中查找,否则中间键就是要找的元素。该算法要求数据元素有顺序存储结构。
选择排序详细
代码展示
/**
* 选择排序
*/
public static void main(String[] args) {
//定义一个数组
int [] arr = new int[]{3,1,5,8,12,7,4,9,11};
String str1 = "";
for (int i : arr) {
str1 += i+",";
}
//打印数组的初始数据
System.out.println(str1);
//进行从小到大的排序,找最小元素
for (int i =0 ;i < arr.length-1 ; i++){
//记住最小元素的索引
int minIndex = i ;
for (int j = i ;j < arr.length ; j++){
if(arr[j]<arr[minIndex]){
//比较发现比之前定义的最小索引小,将此时小的索引赋值给最小索引
minIndex=j;
}
}
//每次循环完成,需要交换位置
// 该操作很有可能将稳定性打破,所以选择排序是很不稳定的排序算法
if(arr[i]!=arr[minIndex]){
int temp = arr[i];
//交换位置
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
String str2 = "";
for (int i : arr) {
str2 += i+",";
}
//打印数组排序后的数据
System.out.println(str2);
}
测试结果展示
希尔排序详细
代码展示
/**
* 希尔排序
*/
public static void main(String[] args) {
//定义一个数组
int [] arr = new int[]{3,19,5,8,12,7,66,9,11,31};
//打印数组初始数据
System.out.println("排序前 : "+arrToString(arr));
//定义初始增量
int gap = arr.length/2;
while(gap>=1){
//将距离为gap的数据元素编为一个组
for(int i = gap; i<arr.length; i++){
int j = 0;
int temp = arr[i];
//对距离为gap的元素组进行排序
for(j = i-gap ; j>=0 && temp<arr[j]; j = j-gap){
arr[j+gap] = arr[j];
}
arr[j+gap] = temp;
}
System.out.format("gap = %d:\t", gap);
System.out.println(arrToString(arr));
//每次循环后缩小增量
gap=gap/2;
}
//打印数组排序后的数据
System.out.println("排序后 : "+arrToString(arr));
}
public static String arrToString(int [] arr){
String str2 = "";
for (int i : arr) {
str2 += i+",";
}
return str2;
}
测试结果展示
二分查找详细
代码展示
/**
* 选择排序
*/
public static void main(String[] args) {
//定义一个数组
int [] arr = new int[]{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18};
//定义需要查找的元素
int key = 13;
System.out.println(findkey(arr,key));
key = 6;
System.out.println(findkey(arr,key));
key = 9;
System.out.println(findkey(arr,key));
}
public static int findkey(int[] arr,int key) {//参数1:查询操作的数组---参数2:需要查询的元素
int start = 0;
int end = arr.length - 1;
int mid;
while (start <= end) {
mid = (end - start) / 2 + start;
if (key < arr[mid]) {
//如果key小于中间值,查询数组左边的元素
end = mid - 1;
} else if (key > arr[mid]) {
//如果key大于中间值,查询数组右边的元素
start = mid + 1;
} else {
//返回元素下标
return mid;
}
}
//如果没找到返回-1
return -1;
}