Java中的几种排序算法

插入排序:自1开始,通过交换将i插入其左端的有序的数列中。 交换次数不确定,但比较次数较均衡。 比冒泡更优。

1 private static void charu(int x[], int off, int len) {
2         for (int i = off; i < len + off; i++)
3             for (int j = i; j > off && x[j - 1] > x[j]; j--)
4                 swap(x, j, j - 1);
5     }

选择排序:与冒泡相似,每一趟找到自i到末端最小的数的index,然后与i交换 一趟只需一次交换,所以比冒泡快。

 1 private static void xuanze(int x[], int off, int len) {
 2         for (int i = off; i < len + off; i++) {
 3             int min = i;
 4             for (int j = min; j < len + off; j++) {
 5                 if (x[min] > x[j])
 6                     min = j;
 7             }
 8             swap(x, i, min);
 9         }
10     }

冒泡排序:i从左至右,i定住时将自i到末端最小的数移至i处,完成一趟,以此类推直至i到最右端 通过不停交换完成,时间消耗较多。

1 private static void maopao(int x[], int off, int len) {
2         for (int i = off; i < len + off - 1; i++) {
3             for (int j = i; j < len + off; j++) {
4                 if (x[i] > x[j])
5                     swap(x, i, j);
6             }
7         }
8     }

快速排序法:首先任意选取一个数据作为关键数据,然后将所有比它小的数都放到它前面, 所有比它大的数都放到它后面,这个过程称为一趟快速排序。之后递归。

算法: 1)i从左到右找比key大的,i移至此处;j从右到左找比key小的,j移至此处

2)若i<j则交换ij,重复1);否则,一趟完成

3)一趟完成之后i如果未到最右端,递归右端;j如果未到达最左端,递归左端 此算法可改进,请参详jdk源码。

 1 private static void kuaisu(int x[], int off, int len) {
 2         int m = off + (len >> 1); // 中位下标
 3         int left = off;// 起始下标
 4         int right = off + len - 1;// 结束下标
 5         m = med3(x, left, m, right);
 6         int key = x[m];// 取中间的那个作为关键数据
 7         // System.out.println("key="+key);
 8         int i = left;
 9         int j = right;
10         while (true) {
11             while ((x[i] < key) && (i < right))
12                 // 从左到右找>=的
13                 i++;
14             while ((x[j] > key) && (j > left))
15                 // 从右到左找<=的
16                 j--;
17             if (i >= j) {
18                 break;// 一趟完成
19             }
20             swap(x, i, j);
21             System.out.printf("swap %d %d:%s\n", i, j, Arrays.toString(x));
22         }
23         if (i < right)
24             kuaisu(x, i + 1, right - i);
25         if (j > left)
26             kuaisu(x, left, j - left);
27     }

求数值处于中间的下标:

1 private static int med3(int x[], int a, int b, int c) {
2         return (x[a] < x[b] ? (x[b] < x[c] ? b : x[a] < x[c] ? c : a)
3                 : (x[b] > x[c] ? b : x[a] > x[c] ? c : a));
4     }

在数组x中交换a b位置:

1 private static void swap(int x[], int a, int b) {
2         int t = x[a];
3         x[a] = x[b];
4         x[b] = t;
5     }
时间: 2024-08-05 17:33:19

Java中的几种排序算法的相关文章

Java中的几种排序算法:冒泡排序,插入排序,二分法排序,简单排序,快速排序

冒泡排序: int[] hehe={4,7,2,5,6,9,0}; for(int i=0;i<hehe.length;i++){ for(int j=i+1;j<hehe.length;j++){ if(hehe[i]>hehe[j]){ int temp=hehe[i]; hehe[i]=hehe[j]; hehe[j]=temp; } } } 插入排序 int[] a={13,7,8,9,10,1,2,32}; int i,j,t,h; for (i=1;i<a.length

Java中的数据结构及排序算法

(明天补充) 主要是3种接口:List Set Map List:ArrayList,LinkedList:顺序表ArrayList,链表LinkedList,堆栈和队列可以使用LinkedList模拟 Set:HashSet没有重复记录的集合 Map:HashMap就是哈希表 Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtable ├HashMap └WeakHashMap 数据结构参考链接

Java常见的几种排序算法-插入、选择、冒泡、快排、堆排等

本文就是介绍一些常见的排序算法.排序是一个非常常见的应用场景,很多时候,我们需要根据自己需要排序的数据类型,来自定义排序算法,但是,在这里,我们只介绍这些基础排序算法,包括:插入排序.选择排序.冒泡排序.快速排序(重点).堆排序.归并排序等等.看下图: 给定数组:int data[] = {9,2,7,19,100,97,63,208,55,78} 一.直接插入排序(内部排序.O(n2).稳定) 原理:从待排序的数中选出一个来,插入到前面的合适位置. [java] view plain copy

Java中的几种排序方法

日常操作中常见的排序方法很多,比如有:冒泡排序.快速排序.选择排序.插入排序.希尔排序,甚至还有基数排序.鸡尾酒排序.桶排序.鸽巢排序.归并排序等. 一.冒泡排序 一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来. 走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端. 1 /** 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 2 *对每一对相邻元

Java中的七种排序方式代码示例

package baseJava; /** * @title SortMethods.java * @author DonsenChen * @Date 2018年5月2日 上午10:16:03 * @Description */ public class SortMethods { public static void main(String[] args) { int[] arr = { 3, 7, 9, 1, 4, 8, 2, 6, 5 }; binarySort(arr); bubble

一遍记住Java常用的八种排序算法与代码实现

1.直接插入排序 经常碰到这样一类排序问题:把新的数据插入到已经排好的数据列中. 将第一个数和第二个数排序,然后构成一个有序序列 将第三个数插入进去,构成一个新的有序序列. 对第四个数.第五个数--直到最后一个数,重复第二步. 如何写写成代码: 首先设定插入次数,即循环次数,for(int i=1;i<length;i++),1个数的那次不用插入. 设定插入数和得到已经排好序列的最后一个数的位数.insertNum和j=i-1. 从最后一个数开始向前循环,如果插入数小于当前数,就将当前数向后移动

php中的四种排序算法

1 1. 冒泡排序 2 3 思路分析:在要排序的一组数中,对当前还未排好的序列,从前往后对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒.即,每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换. 4 5 代码实现: 6 7 8 $arr=array(1,43,54,62,21,66,32,78,36,76,39); 9 function bubbleSort($arr) 10 { 11 $len=count($arr); 12 //该层循环控制 需要冒泡的轮数 13

Java常用的八种排序算法与代码实现

1.直接插入排序 2.希尔排序 3.简单选择排序 4.堆排序 5.冒泡排序 6.快速排序 7.归并排序 8.基数排序 1.直接插入排序 经常碰到这样一类排序问题:把新的数据插入到已经排好的数据列中. 将第一个数和第二个数排序,然后构成一个有序序列 将第三个数插入进去,构成一个新的有序序列. 对第四个数.第五个数--直到最后一个数,重复第二步. 如何写成代码: 首先设定插入次数,即循环次数,for(int i=1;i<length;i++),1个数的那次不用插入. 设定插入数和得到已经排好序列的最

Java常用的7大排序算法汇总(转载)

这段时间闲了下来,就抽了点时间总结了下java中常用的七大排序算法,希望以后可以回顾! 1.插入排序算法 插入排序的基本思想是在遍历数组的过程中,假设在序号 i 之前的元素即 [0..i-1] 都已经排好序,本趟需要找到 i 对应的元素 x 的正确位置 k ,并且在寻找这个位置 k 的过程中逐个将比较过的元素往后移一位,为元素 x “腾位置”,最后将 k 对应的元素值赋为 x ,一般情况下,插入排序的时间复杂度和空间复杂度分别为 O(n2 ) 和 O(1). /** * @param int[]