六大算法: 插入、选择、冒泡、快速、二分、水桶

JAVA经典算法链接:转载请注明出处:http://blog.csdn.net/l1028386804/article/details/51097928

 

 

 

*************************冒泡排序******************************

int[] arr = {5, 1, 2, 3, 7, 8, 6, 4};

int flag = 0;//0代表无序,1代表有序

//外循环决定需要几次冒泡

for(int i = 0 ;i<arr.length-1 && flag == 0;i++)

{ //假定数据有序

flag = 1;

//内循环决定一次冒泡的过程

for(int j=0;j<arr.length-1-i;j++)

//冒泡排序的核心算法,两两比较,满足条件交换

{

if(arr[j]>arr[j+1])

{

int t = arr[j];

arr[j] = arr[j+1];

arr[j+1] = t;

//确定无序

flag = 0;

}

}

}

for(int i =0; i<arr.length;i++)

{

System.out.print(arr[i]+" ");

}

 

}

 

*************************选择排序******************************

排序原理图如下

 

public class Tex {

public static void main(String[] args) {

int[] arr = {6, 7, 2, 1, 3, 8, 9};

for (int i = 0; i < arr.length; i++) {

int minIndex = i;//假定最小数的下标是第一个

for (int j = i; j < arr.length; j++) {

if(arr[minIndex] > arr[j]){

minIndex = j;

}

}

System.out.println("下标为"+minIndex+"最小值为"+arr[minIndex]);

int temp = arr[i];

arr[i] = arr[minIndex];

arr[minIndex] = temp;

}

for (int i = 0; i < arr.length; i++) {

System.out.print(arr[i]+" ");

}

}

}

 

 

插入排序原理

*************************插入排序******************************

public class insert1 {

public static void main(String[] args) {

int[] arr = {5, 7, 2, 1, 3, 6, 9};

//插入排序

for (int i = 1; i < arr.length; i++) {

int j =i;

int temp = arr[j];//取得有序区最后一个元素的值,进入二层循环

while ( j>0 && temp < arr[j-1]){//判断无序区下标(j > 0)不能溢出,判断和前一个数比较

arr[j] = arr[j-1];//进入循环,为要插入的数据留空间,数组后移一位

j--;//下标递减

}

arr[j] = temp;//最后和有序区最后一个元素交换

for (int k = 0; k < arr.length; k++) {

System.out.print(arr[k]+" ");}

System.out.println();

}

for (int i = 0; i < arr.length; i++) {

System.out.print(arr[i]+" ");

}

}

 

}

 

*************************水桶排序******************************

public class Barril {

public static void main(String[] args) {

int[] arr = {5, 7, 2, 1, 3, 6, 9};

int[] arr1 = new int[10];

for(int i = 0; i < arr.length; i++){

arr1[arr[i]]++;

}

for (int i = 0; i < arr1.length; i++) {

}

for(int i = 0 ; i < arr1.length; i++)

for(int j = 0; j < arr1[i]; j++){

System.out.print(i);

}

}

 

}

 

*************************二分查找******************************

必须是有序数列

public static int binarrySeek(int target, int[] src) {

int start = 0;

int end = src.length - 1;

while (start <= end) {

int mid = (start + end) / 2;

if(target > src[mid]){

start = mid +1;

}else if (target < src[mid]) {

end = mid - 1;

} else {

return mid;

}

}

return -1;

}

 

}

 

*************************二分查找******************************

 

//折半查找

public static int binarrySeek(int target, int[] src) {

int start = 0;

int end = src.length - 1;

while (start <= end) {

int mid = (start + end) / 2;

if(target > src[mid]){

start = mid +1;

}else if (target < src[mid]) {

end = mid - 1;

} else {

return mid;

}

}

return -1;

}

 

*************************快速查找(递归)***************************

public static void quickSort(int[] src, int start , int end) {//start和end 是为了递归

if(start >= end) {

//只有一个一下元素,返回

return;

}

int s = start;//定义起点

int e = end;//定义终点

//选出start指向的元素作为基准值

int temp = src[s];

while (s < e) { //起点和终点不重合

while (s < e &&src[e] > temp) { //开始都在基准值右边 当前数据合格 start < end 防止end-过头

e--;//大于基准值不动

}

if (s == e) {

break;//表示基准值找到了位置

}

src[s] = src[e];//小于src【s】的值放在src【s】左右

s++;

while (s < e && src[s] < temp) {//当前数据合格

s++;

}

if (s == e) {

break;

}

src[e] = src[s];

e--;

}

src[s] = temp;//起点终点重合,基准值找到了自己的位置

quickSort(src, start, s - 1);

quickSort(src, s + 1, src.length - 1);

}

*************************快速查找(非递归)**************************

 

import java.util.Arrays;

import java.util.LinkedList;

 

public class Demo2 {

 

public static void main(String[] args) {

int a[] = { 1, 3, 4, 2, 5, 7, 6, 9, 8, 10 };

quickSort(a);

System.out.println(Arrays.toString(a));

}

 

public static void quickSort(int[] a) {

int[] range = { 0, a.length - 1 };

 

LinkedList<int[]> stack = new LinkedList<int[]>();

stack.offerLast(range);

 

while (!stack.isEmpty()) {

int[] r = stack.pollLast();

int start = r[0];

int end = r[1];

int temp = a[start];

while (start < end) {

while (start < end && a[end] > temp) {

end--;

}

 

if (start == end) {

break;

}

 

a[start] = a[end];

start++;

 

while (start < end && a[start] < temp) {

start++;

}

 

if (start == end) {

break;

}

 

a[end] = a[start];

end--;

}

a[start] = temp;

if (r[0] < start - 1) {

stack.offerLast(new int[] { r[0], start - 1 });

}

if (r[1] > start + 1) {

stack.offerLast(new int[] { start + 1, r[1] });

}

}

}

}
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值