几种常见排序算法(Java实现)

几种常见排序算法(Java实现)
几种常见排序算法(Java实现)

排序算法

冒泡排序:

思想:

n个数,将第一个和第二个进行比较,将大的放在第二个位置,再将第二个和第三比较,大的放在第三个位置,依次向后比较,比较n-1次,将最大的放在最后(n的位置),然后再从第一个开始比较,比较n-2次,这次把最大的放到第n-1个位置,然后再来回比较.遵循第i次遍历就从第一个数开始比较n-i次,将最后的值放在第n-i+1的位置.

java代码实现:

// 冒泡排序

public class BubbleSort {

public static void sort(Comparable[] data) {

// 数组长度

int len = data.length;

for (int i = 0; i < len - 1; i++) {

// 临时变量

Comparable temp = null;

// 交换标志,false表示未交换

boolean isExchanged = false;

for (int j = len - 1; j > i; j--) {

// 如果data[j]小于data[j - 1],交换

if (data[j].compareTo(data[j - 1]) < 0) {

temp = data[j];

data[j] = data[j - 1];

data[j - 1] = temp;

// 发生了交换,故将交换标志置为真

isExchanged = true;

}// end if

}// end for

// 本趟排序未发生交换,提前终止算法,提高效率

if (!isExchanged) {

break;

}// end if

}// end for

}// end sort

public static void main(String[] args) {

// 在JDK1.5版本以上,基本数据类型可以自动装箱

// int,double等基本类型的包装类已实现了Comparable接口

Comparable[] c = { 4, 9, 23, 1, 45, 27, 5, 2 };

sort(c);

System.out.println("冒泡排序后: ");

for(int i = 0; i

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

}

// for (Comparable data : c) {

// System.out.println(data);

// }

}

}// 简单示例

public class Test_Ordination {

public static void main(String args[]) {

int[] s = { 23, 5, 12, 59, 78, 21, 100, 79, 66 };

for (int j = 1; j <= s.length; j++) {

for (int i = 0; i < s.length - 1; i++) {

if (s[i] > s[i + 1]) {

int temp;

temp = s[i];

s[i] = s[i + 1];

s[i + 1] = temp;

}

}

}

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

System.out.println(s[i]);

}

}

}

快速排序:

思想:

基于冒泡排序,取第一个作为关键值a,用a与后面开始往前比较,遇到比a小的则交换,依然乘此关键值为a,再用a与第一个数开始向后比较,遇到比a大的则交换,最终的关键值将依然是最初的第一个元素的值,用此值将此无序序列分成两部分,比它小的都在它前面,大的都在后面,然后用递归将前面和后面的分别用快速排序进行处理,得到最终的有序序列.

java代码实现:

public class QuickSort {

public static void main(String[] args) {

// int [] arry={49, 38, 65, 97, 76, 13, 27};

int[] arry = { 27, 38, 65, 97, 76, 48, 49 };

// 程序还有问题.比如当数据为49,38, 65, 97, 76, 13, 27,12,11

// 的时候,第一次就把最小一位放到第一位,,而出现问题

QuickSort.method2(arry);

// Arrays.sort(arry, 0, arry.length);

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

System.out.println("结果:" + arry[i]);

}

}

/** * 快速排序* @param arry */

public static void method2(int[] array) {

// 1)设置两个变量I、J,排序开始的时候:I=0,J=N-1;

int i = 0;

int j = array.length - 1;

// 获取数组最后一位

// 2)以第一个数组元素作为关键数据,赋值给key,即 key=A[0];

int k = array[0];

// 获取数组第一位

int f = 0;

boolean check = false;

int x = 0;

while (i != j) {

// 3)从J开始向前搜索,即由后开始向前搜索(J=J-1),找到第一个小于key 的值A[J],并与key交换;

while (array[j] > k) {

j--;

}

System.out.println("i0: "+ i + "; "+ "j0: "+ j + "; "+ "k0: "

+ k + "; f0: " + f);

int temp = k;

k = array[j];

array[j] = temp;

// [49, 38, 65, 97, 76, 13, 49] //[27, 38, 65, 97, 76, 13, 49]

// [27, 38, 49, 97, 76, 13, 65] //[27, 38, 49, 97, 76, 49, 65]

// [27, 38, 13, 97, 76, 49, 65] //[27, 38, 13, 49, 76, 97, 65]

// [27, 38, 13, 49, 76, 97, 65]

// 4)从I开始向后搜索,即由前开始向后搜索(I=I+1),找到第一个大于key 的A[I],与key交换;

while (array[i] < k) {

i++;

}

System.out.println("i1: "+ i + "; "+ "j1: "+ j + "; "+ "k1: "

+ k + "; f1: " + f);

int temp1 = k;

k = array[i];

array[i] = temp1;

System.out.println("i2: "+ i + "; "+ "j2: "+ j + "; "+ "k2: "

+ k + "; f2: " + f);

for (int a = 0; a < array.length; a++) {

System.out.print(array[a] + ",");

}

System.out.println();

// [27, 38, 65, 97, 76, 13, 49] //[27, 38, 49, 97, 76, 13, 49]

// [27, 38, 49, 97, 76, 13, 65] //[27, 38, 13, 97, 76, 49, 65]

// [27, 38, 13, 49, 76, 49, 65] //[27, 38, 13, 49, 76, 97, 65]

System.out.println(array[i] + " " + array[j]);

if (array[i] == array[j]) {

x++;

if (x > (array.length / 2 + 1)) {

check = true;

}

}

if (i == j || check) {

k = array[0];

// 获取数组第一位

if (i == j && i == 0) {

k = array[1];

}

i = 0;

j = array.length - 1;

// 获取数组最后一位

check = false;

x = 0;

if (f > (array.length / 2 + 1)) {

k = array[j];

}

if (f == array.length) {

break;

}

f++;

}// [27, 38, 13, 49, 76, 97, 65] //[13, 27, 38, 49, 76, 97, 65] }

// }

}

}

}

插入排序(直接插入排序):

思想:

先将无序序列中的第一个值去除作为关键值,然后将其放入有序序列(即作为新序列的第一个值),然后取第二个值作为关键值,将关键值放入有序序列,并与第一个值进行比较,若小于第一个值,则将这个关键值插入到第一个值前面(交换),后面依次取值然后和前面的有序序列中的值进行比较,插入到合适位置

java代码实现:

public class InsertSort {

public static void sort(Comparable[] data) {

// 数组长度

int len = data.length;

// 从下标为1开始依次插入

for (int i = 1; i < len; i++) {

// 当前待插入的数据

Comparable currentData = data[i];

int temp = i;

while(temp > 0 && data[temp - 1].compareTo(currentData) > 0) {

// 向右移动

data[temp] = data[temp - 1];

temp--;

}

// end while

data[temp] = currentData;

}// end for

}// end sort

public static void main(String[] args) {

// 在JDK1.5版本以上,基本数据类型可以自动装箱

// int,double等基本类型的包装类已实现了Comparable接口

Comparable[] c = { 4, 9, 23, 1, 45, 27, 5, 2 };

sort(c);

System.out.println("插入排序后: ");

for(int i = 0; i

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

}

}

}

选择排序:

思想:

与冒泡不同的是:冒泡是大的与小的交换,而选择是用下标来作为标记,记录哪个是最小的,一次遍历后交换一次,两种算法比较的次数一样,但是交换的次数不同.

java代码实现:

public class SelectSort {

public static void main(String[] args) {

int[] arr = { 2, 345, 111, 1, 34, 5 };

sort(arr);

System.out.println("选择排序后: ");

for(int i = 0; i

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

}

}

public static void sort(int[] arr){

int temp = 0;

int min = 0;

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

min = i;

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

if (arr[min] > arr[j])

min = j;

}

if (min != i) {

temp = arr[min];

arr[min] = arr[i];

arr[i] = temp;

}

}

/*System.out.println("排序后的数组为:");

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

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

}*/

}

}

java程序员必知的十种程序算法

java程序员必学的十种程序算法 算法1:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。 快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。 算法步骤: 1 从数列中挑出一个元素,称为“基准”(pivot),

2 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。 3 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。 递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。 算法2:堆排序算法

堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。 堆排序的平均时间复杂度为Ο(nlogn) 。 算法步骤: 创建一个堆H[0..n-1] 把堆首(最大值)和堆尾互换 3. 把堆的尺寸缩小1,并调用shift_down(0),目的是把新的数组顶端数据调整到相应位置 4. 重复步骤2,直到堆的尺寸为1 算法3:归并排序 归并排序(Merge sort,台湾译作:合并排序)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 算法步骤:

JAVA数组的排序方法实例

冒泡排序法 1.public class SortArray_01 { 2. public static void main(String args[]) { 3. int[] array = { 14, 5, 86, 4, 12, 3, 21, 13, 11, 2, 55 }; // 创建一个初始化的一维数组array 4. System.out.println("未排序的数组:"); 5. for (int i = 0; i < array.length; i++) { // 遍历array数组中的元素 6. System.out.print(" " + array[i]); // 输出数组元素 7. if ((i + 1) % 5 == 0) // 每5个元素一行 8. System.out.println(); 9. } 10. int mid; // 定义一个中间变量, 起到临时存储数据的作用 11. for (int i = 0; i < array.length; i++) { // 执行冒 泡排序法 12. for (int j = i; j < array.length; j++) { 13. if (array[j] < array[i]) { 14. mid = array[i]; 15. array[i] = array[j]; 16. array[j] = mid; 17. } 18. } 19. } 20. System.out.println("\n使用冒泡法排序后的数组:"); 21. for (int i = 0; i < array.length; i++) { // 遍历排好序的array数组中的元素 22. System.out.print(" " + array[i]); // 输出数组元素 23. if ((i + 1) % 5 == 0) 24. System.out.println(); // 每5 个元素一行 25. } 26. } 27.} 数组递增排序

JAVA中运用数组的四种排序方法

JAVA中在运用数组进行排序功能时,一般有四种方法:快速排序法、冒泡法、选择排序法、插入排序法。 快速排序法主要是运用了Arrays中的一个方法Arrays.sort()实现。 冒泡法是运用遍历数组进行比较,通过不断的比较将最小值或者最大值一个一个的遍历出来。 选择排序法是将数组的第一个数据作为最大或者最小的值,然后通过比较循环,输出有序的数组。 插入排序是选择一个数组中的数据,通过不断的插入比较最后进行排序。下面我就将他们的实现方法一一详解供大家参考。 <1>利用Arrays带有的排序方法快速排序 import java.util.Arrays; publicclass Test2{ publicstaticvoid main(String[] args){ int[] a={5,4,2,4,9,1}; Arrays.sort(a); //进行排序 for(int i: a){ System.out.print(i); } } } <2>冒泡排序算法 publicstaticint[] bubbleSort(int[] args){//冒泡排序算法 for(int i=0;iargs[j]){ int temp=args[i]; args[i]=args[j]; args[j]=temp; } } } return args; } <3>选择排序算法 publicstaticint[] selectSort(int[] args){//选择排序算法 for (int i=0;i

java中8大排序方法

Java程序员必知的8大排序本文主要详解了Java语言的8大排序的基本思想以及实例解读,详细请看下文8种排序之间的关系: 1,直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排 好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数 也是排好顺序的。如此反复循环,直到全部排好顺序。 (2)实例

(3)用java实现 1.package com.njue; 2. 3.public class insertSort { 4.public insertSort(){ 5. inta[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17, 18,23,34,15,35,25,53,51}; 6.int temp=0; 7.for(int i=1;i=0&&temp

Java各种排序算法

Java排序算法 1)分类: 1)插入排序(直接插入排序、希尔排序) 2)交换排序(冒泡排序、快速排序) 3)选择排序(直接选择排序、堆排序) 4)归并排序 5)分配排序(箱排序、基数排序) 所需辅助空间最多:归并排序 所需辅助空间最少:堆排序 平均速度最快:快速排序 不稳定:快速排序,希尔排序,堆排序。 1)选择排序算法的时候 1.数据的规模; 2.数据的类型; 3.数据已有的顺序 一般来说,当数据规模较小时,应选择直接插入排序或冒泡排序。任何排序算法在数据量小时基本体现不出来差距。考虑数据的类型,比如如果全部是正整数,那么考虑使用桶排序为最优。考虑数据已有顺序,快排是一种不稳定的排序(当然可以改进),对于大部分排好的数据,快排会浪费大量不必要的步骤。数据量极小,而起已经基本排好序,冒泡是最佳选择。我们说快排好,是指大量随机数据下,快排效果最理想。而不是所有情况。 3)总结: ——按平均的时间性能来分: 1)时间复杂度为O(nlogn)的方法有:快速排序、堆排序和归并排序,其中以快速排序为最好; 2)时间复杂度为O(n2)的有:直接插入排序、起泡排序和简单选择排序,其中以直接插入为最好,特别是对那些对关键字近似有序的记录序列尤为如此; 3)时间复杂度为O(n)的排序方法只有,基数排序。 当待排记录序列按关键字顺序有序时,直接插入排序和起泡排序能达到O(n)的时间复杂度;而对于快速排序而言,这是最不好的情况,此时的时间性能蜕化为O(n2),因此是应该尽量避免的情况。简单选择排序、堆排序和归并排序的时间性能不随记录序列中关键字的分布而改变。 ——按平均的空间性能来分(指的是排序过程中所需的辅助空间大小): 1)所有的简单排序方法(包括:直接插入、起泡和简单选择)和堆排序的空间复杂度为O(1); 2)快速排序为O(log n ),为栈所需的辅助空间; 3)归并排序所需辅助空间最多,其空间复杂度为O(n ); 4)链式基数排序需附设队列首尾指针,则空间复杂度为O(rd )。 ——排序方法的稳定性能: 1)稳定的排序方法指的是,对于两个关键字相等的记录,它们在序列中的相对位置,在排序之前和经过排序之后,没有改变。 2)当对多关键字的记录序列进行LSD方法排序时,必须采用稳定的排序方法。 3)对于不稳定的排序方法,只要能举出一个实例说明即可。 4)快速排序,希尔排序和堆排序是不稳定的排序方法。 4)插入排序: 包括直接插入排序,希尔插入排序。 直接插入排序:将一个记录插入到已经排序好的有序表中。 1, sorted数组的第0个位置没有放数据。

Java数据结构和算法笔记

Java数据结构和算法 第0讲综述 参考教材:Java数据结构和算法(第二版),[美] Robert lafore 1. 数据结构的特性 数据结构< 缺点 优点 数组插入快;如果知道下标,可以非常快地存取查找慢,删除慢,大小固定 有序数组比无序的数组查找快删除和插入慢,大小固定 提供后进先出方式的存取存取其他项很慢 < 栈 队列提供先进先出方式的存取存取其他项很慢 链表插入快,删除快— 查找慢 二叉树查找、插入、删除都快(如果树保持平衡)删除算法复杂 红-黑树查找、插入、删除都快;树总是平衡的算法复杂 算法复杂 2-3-4树` 查找、插入、删除都快;树总是平衡的;类 似的树对磁盘存储有用 哈希表如果关键字已知,则存储极快;插入快删除慢,如果不知道关键字则存 储很慢,对存储空间使用不充分堆插入、删除快;对大数据项的存取很快对其他数据项存取慢 对现实世界建模有些算法慢且复杂 》 图 2. 经典算法总结 查找算法:线性查找和二分查找 排序算法: 用表展示 ! 第一讲数组 1.Java中数组的基础知识 1)创建数组

在Java中把数组当作对象来对待,因此在创建数组时必须使用new操作符: < 一旦创建数组,数组大小便不可改变。 2)访问数组数据项 3)数组的初始化 当创建数组之后,除非将特定的值赋给数组的数据项,否则它们一直是特殊的null对 等效于下面使用new来创建数组并初始化: | 2.面向对象编程方式 1)使用自定义的类封装数组

| # !

子问题须与原始问题为同样的事,且更为简单; b. 不能无限制地调用本身,须有个出口,化简为非递归状况处理。 1.三角数字 该数列中的首项为1,第n项是由第n-1项加n后得到的。 1)使用循环查找第n项

Java实现的常见排序算法

以下内容节选自Java私塾自编经典教材: 下面是Java实现的一些常见排序算法。 1:冒泡排序 对几个无序的数字进行排序,比较常用的方法是冒泡排序法。冒泡法排序是一个比较简单的排序方法,在待排序的数列基本有序的情况下排序速度较快。 基本思路:对未排序的各元素从头到尾依次比较相邻的两个元素是否逆序(与欲排顺序相反),若逆序就交换这两元素,经过第一轮比较排序后便可把最大(或最小)的元素排好,然后再用同样的方法把剩下的元素逐个进行比较,就得到了你所要的顺序。 可以看出如果有N个元素,那么一共要进行N-1轮比较,第I轮要进行N-I次比较。(如:有5个元素,则要进行5-1轮比较。第3轮则要进行5-3次比较) 示例如下: public class Test { public static void main(String[] args) { //需要排序的数组,目前是按照升序排列的 int a[] = new int[5]; a[0] = 3; a[1] = 4; a[2] = 1; a[3] = 5; a[4] = 2; //冒泡排序 for(int i=0;i a[j]){ int temp = a[j]; a[j] = a[i]; a[i] = temp; } } } //检测一下排序的结果 for(int i : a){ System.out.println("i="+i); } } } 运行结果: i=1 i=2

JAVA排序选择题

一、选择题 1.某内排序方法的稳定性是指()。 A.该排序算法不允许有相同的关键字记录B.该排序算法允许有相同的关键字记录 C.平均时间为0(n log n)的排序方法D.以上都不对 2.下面给出的四种排序法中()排序法是不稳定性排序法。 A.插入 B.冒泡 C.二路归并 D.堆积 3.下列排序算法中,其中()是稳定的。 A.堆排序,冒泡排序 B.快速排序,堆排序 C.直接选择排序,归并排序 D.归并排序,冒泡排序 4.稳定的排序方法是() A.直接插入排序和快速排序B.折半插入排序和起泡排序 C.简单选择排序和四路归并排序D.树形选择排序和shell排序 5.下列排序方法中,哪一个是稳定的排序方法?() A.直接选择排序B.二分法插入排序C.希尔排序D.快速排序 6.若要求尽可能快地对序列进行稳定的排序,则应选(A.快速排序B.归并排序C.冒泡排序)。 7.如果待排序序列中两个数据元素具有相同的值,在排序前后它们的相互位置发生颠倒,则称该排序算法是 不稳定的。()就是不稳定的排序方法。 A.起泡排序B.归并排序C.Shell排序D.直接插入排序E.简单选择排序8.若要求排序是稳定的,且关键字为实数,则在下列排序方法中应选()排序为宜。 A.直接插入B.直接选择C.堆D.快速E.基数 9.若需在O(nlog2n)的时间内完成对数组的排序,且要求排序是稳定的,则可选择的排序方法是()。 A.快速排序 B.堆排序 C.归并排序 D.直接插入排序 10.下面的排序算法中,不稳定的是() A.起泡排序 B.折半插入排序 C.简单选择排序 D.希尔排序 E.基数排序 F.堆排序。 11.下列内部排序算法中: A.快速排序B.直接插入排序C.二路归并排序D.简单选择排序E.起泡排序F.堆排序(1)其比较次数与序列初态无关的算法是()(2)不稳定的排序算法是() (3)在初始序列已基本有序(除去n个元素中的某k个元素后即呈有序,k<

Java常用基本算法

4.1 算法 前面我们已经讲过,程序=数据结构+算法。 什么是算法?对一个现有的问题我们采取的解决过程及方法,即为算法。一个用算法实现的程序会耗费两种资源:处理时间和内存。 算法的效率分析标准: 时间复杂度 空间复杂度 简单性和清晰性 对于时间复杂度,可以通过System.currentTimeMillis()方法来测试。例如:public class Test { public static void main(String args[]) { System.out.println(System.currentTimeMillis()); fun(); System.out.println(System.currentTimeMillis()); } public static void fun() { double a = 0; for(int i = 0; i < 10000; i++) for(int j = 0; j < 10000; j++) for(int k = 0; k < 100; k++) a++; } } 前后两次获得当前系统时间的差值就是运行所消耗的时间(毫秒为单位)。 通过System.currentTimeMillis()方法来测试的缺点: a.不同的平台执行的时间不同 b.有些算法随着输入数据的加大,测试时间会变得不切实际! 4.2 查找 4.2.1 查找之线性查找(直接查找) 算法思路:从数组的第一个元素开始查找,并将其与查找值比较,如果相等则停止,否则继续下一个元素查找,直到找到匹配值。 注意:被查找的数组中的元素可以是无序的、随机的。 实例: import java.util.*; public class Demo1 { public static void main(String args[]) {

冒泡排序法、选择排序法、插入排序法(java案例详解)

1.冒泡排序法 /** *功能:冒泡排序法 *思想:通过对待排序序列从后向前(从下标较大的元素开始),依次比较相邻元素的排序码, *,若发现逆序这交换,使得排序码较小的元素逐渐从后部移向前部(从下标较大的单元移向下标) *较小的单元,,就像水底下的气泡一样逐渐向上冒。 *作者:徐守威 */ package com.xushouwei; public class T4 { /** *@param args */ public static void main(String[] args) { // TODO Auto-generated method stub int arr1[]={1,6,0,-1,9,-100,90}; //开始排序,创建一个Bubble类 Bubble bubble=new Bubble(); bubble.sort(arr1); //输出最后结果 for(int i=0;i

//排序方法 public void sort(int arr[]) { //第一层循环用来指定排序的次数 //定义一个临时变量来存放交换的值 int temp=0; for(int i=0;iarr[j+1]) { //交换位置 temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } } } 2.选择排序法 /** *功能:选择排序法 *思想:第一次从R[0]-R[N-1]中选取最小值,与R[0]交换,第二次从 R[1]-R[N-1]中选取最小值,与R[1]交换, *第三次从R[2]-R[N-1]中选取最小值,与R[2]交换...第i次从 R[i]-R[N-1]中选取最小值,与R[i-1]交换, *第n-1次从R[n-2]-R[N-1]中选取最小值,与R[n-2]交换,总共通过n-1

十 大 经 典 排 序 算 法 总 结 超 详 细

数据结构七种排序算法讲解及其Java实现 数据结构七种排序算法讲解及其Java实现冒泡排序算法描述Java代码时间复杂度选择排序算法描述Java代码时间复杂度插入排序算法描述Java代码时间复杂度希尔排序算法描述Java代码时间复杂度归并排序算法描述Java代码时间复杂度快速排序算法描述Java代码时间复杂度堆排序算法描述Java代码时间复杂度总结 数据结构的排序算法共有十种,本文仅给出其中七种算法,有空的话会把剩下的三种(基数排序、计数排序、桶排序)补全。 本文代码使用的测试样例: int[] arr = {1,2,3,4,5}; int[] arr1 = {5,4,3,2,1}; int[] arr2 = {1,5,3,4,2}; 本文对于需要排序的数组为a,类型为整形数组,假设其长度为n,所以数组下标范围为[0, n-1] 冒泡排序 冒泡排序可以说是我们最基础的排序方式了,可以说是排序题的暴力解法 算法描述 核心思想: 每轮都把最大的元素移到最右边,再开始下一轮,从剩下的元素中继续挑选最大值继续移动到右边,这样的操作重复n轮,即可完成排序(其

实只要n-1次就够了,最后一次只剩下一个元素) 具体过程: 首先将数组从a[0]到a[n-1],通过一次次比较,把最大的元素移到最右边的a[n-1],此时a[0]到a[n-1]的最大的元素已经放到a[n-1] 第二次将数组从a[0]到a[n-2],通过一次次比较,把最大的元素移到最右边的a[n-2],此时a[0]到a[n-1]的第二大的元素已经放到a[n-1] 第三次将数组从a[0]到a[n-3],… Java代码 public int[] bubbleSort(int[] array) { for (int i = 0; i array.length; i++) { boolean isSwapped = false; for (int j = 0; j array.length - 1 - i; j++) { if (array[j] array[j+1]) { int tmp = array[j]; array[j] = array[j+1]; array[j+1] = tmp; isSwapped = true; if (!isSwapped) { return array; 时间复杂度 最好情况O(n), 最坏情况O(n2), 平均情况O(n2) 最好情况便是如[1,2,3,4,5]这样的情况,外层循环只需要执行一次,

Java排序算法

六归并排序 算法思想是每次把待排序列分成两部分,分别对这两部分递归地用归并排序,完成后把这两个子部分合并成一个 序列。 归并排序借助一个全局性临时数组来方便对子序列的归并,该算法核心在于归并。 package algorithms; import https://www.360docs.net/doc/7d2253275.html,ng.reflect.Array; /** * @author yovn * */ public class MergeSorter> extends Sorter { /* (non-Javadoc) * @see algorithms.Sorter#sort(E[], int, int) */ @SuppressWarnings("unchecked") @Override public void sort(E[] array, int from, int len) { if(len<=1)return; E[] temporary=(E[])Array.newInstance(array[0].getClass(),len); merge_sort(array,from,from+len-1,temporary); } private final void merge_sort(E[] array, int from, int to, E[] temporary) { if(to<=from) { return; } int middle=(from+to)/2; merge_sort(array,from,middle,temporary);

merge_sort(array,middle+1,to,temporary); merge(array,from,to,middle,temporary); } private final void merge(E[] array, int from, int to, int middle, E[] temporary) { int k=0,leftIndex=0,rightIndex=to-from; System.arraycopy(array, from, temporary, 0, middle-from+1); for(int i=0;i

java排序算法大全

java排序算法大全 为了便于管理,先引入个基础类: package algorithms; public abstract class Sorter> { public abstract void sort(E[] array,int from ,int len); public final void sort(E[] array) { sort(array,0,array.length); } protected final void swap(E[] array,int from ,int to) { E tmp=array[from]; array[from]=array[to]; array[to]=tmp; } } 一插入排序 该算法在数据规模小的时候十分高效,该算法每次插入第K+1到前K个有序数组中一个合适位置,K从0开始到N-1,从而完成排序: package algorithms; /** * @author yovn */ public class InsertSorter> extends Sorter { /* (non-Javadoc) * @see algorithms.Sorter#sort(E[], int, int) */ public void sort(E[] array, int from, int len) { E tmp=null; for(int i=from+1;ifrom;j--) { if(https://www.360docs.net/doc/7d2253275.html,pareTo(array[j-1])<0) { array[j]=array[j-1]; } else break;

java排序123

java排序123 为了便于管理,先引入个基础类: package algorithms; public abstract class Sorter> { public abstract void sort(E[] array,int from ,int len); public final void sort(E[] array) { sort(array,0,array.length); } protected final void swap(E[] array,int from ,int to) { E tmp=array[from]; array[from]=array[to]; array[to]=tmp; } } 一插入排序 该算法在数据规模小的时候十分高效,该算法每次插入第K+1到前K个有序数组中一个合适位置,K从0开始到N-1,从而完成排序: package algorithms; /** * @author yovn */ public class InsertSorter> extends Sorter { /* (non-Javadoc) * @see algorithms.Sorter#sort(E[], int, int) */ public void sort(E[] array, int from, int len) { E tmp=null; for(int i=from+1;ifrom;j--) { if(https://www.360docs.net/doc/7d2253275.html,pareTo(array[j-1])<0) { array[j]=array[j-1]; } else break;

JAVA常用4种排序方法

JAVA常用4种排序方法 JAVA中在运用数组进行排序功能时,一般有四种方法:快速排序法、冒泡法、选择排序法、插入排序法。 快速排序法主要是运用了Arrays中的一个方法Arrays.sort()实现。 冒泡法是运用遍历数组进行比较,通过不断的比较将最小值或者最大值一个一个的遍历出来。 选择排序法是将数组的第一个数据作为最大或者最小的值,然后通过比较循环,输出有序的数组。 插入排序是选择一个数组中的数据,通过不断的插入比较最后进行排序。下面我就将他们的实现方法一一详解供大家参考。 <1>利用Arrays带有的排序方法快速排序 复制代码 1 import java.util.Arrays; 2 public class Test2{ 3 public static void main(String[] args){ 4 int[] a={5,4,2,4,9,1}; 5 Arrays.sort(a); //进行排序 6 for(int i: a){ 7 System.out.print(i); 8 } 9 } 10 } 复制代码 <2>冒泡排序算法 复制代码 1 public static int[] bubbleSort(int[] args){//冒泡排序算法 2 for(int i=0;iargs[j]){ 5 int temp=args[i]; 6 args[i]=args[j]; 7 args[j]=temp; 8 } 9 } 10 } 11 return args; 12 } 复制代码

排序算法比较_java课程设计_刘阳辉

目录 一、课程设计目的 (02) 二、设计内容和要求 (02) 三、程序开发环境 (02) 四、程序内容 (02) 五、设计原理 (02) 六、技术亮点 (02) 七、程序流程图 (03) 八、程序模拟运 (03) 九、程序代码 (05) 十、设计体会 (18)

一、设计目的 1.掌握各种排序的基本思想。 2.掌握各种排序方法的算法实现。 3.掌握各种排序方法的优劣分析及花费的时间的计算。 4.掌握各种排序方法所适应的不同场合。 二、设计内容和要求 利用随机函数产生30000个随机整数,利用插入排序、起泡排序、选择排序、快速排序、堆排序、归并排序等排序方法进行排序,并统计每一种排序上机所花费的时间。 三、开发环境 开发平台:windows XP 开发环境:MyEclipse 8.5 jdk 6.0 开发语言:java 四、程序内容 第一部分:显示用户界面; 第二部分:输入希望产生的随机数的数量; 第三部分:点击获取数据按钮,根据用户输入的随机数的数量产生相应的随机数,并显示出来; 第四部分:点击排序按钮,将产生的随机数进行排序后重新显示出来,并计算显示每种排序算法所用的想用时间。 五、设计原理 首先使用随机函数产生相应的随机数并保存在整型数组中,并将整型数组里面的元素显示到用户界面,点击排序按钮后,将整形数组以传地址的方式传到排序类中进行排序,排序完后将再次显示整形数组里面的所有元素。 六、技术亮点 1.为提高程序效率,在使用七种排序算法时采用多线程技术同时执行七个排序线程,从而提高程序执行效率; 2.自定义动态数组,在程序执行的过程中根据用户输入的随机数的量来产生相应大小的整形数组; 3.更人性化的随机数,根据用户输入的随机数的数量(max)来产生的随机数的范围为0至max;

JAVA数组入门与选择排序算法讲义

数组与选择排序算法 一、概念 数组是一种数据结构,是用来存储同一数据类型的数值的集合。通过数组的下标可以访问数组的每一个元素。例如,整型数组a[i]用来存储整型数据,i就是下标。数组的下标是从0开始计数的。 在声明数组的时候,需要指明数组的数据类型和数组变量的名字。例如,下面就是声明整型数组的格式。 int a[]或int[]a 这条语句只是声明了数组,但是还没有对数组分配内存,即没有进行实例化。如果需要实例化,则必须使用new关键字。例如 int a[]=new int[100] 该语句声明了整型数组,且数组中可以存储100个整型数据。 只有对数组进行了实例化,才可以对数组的每个元素进行赋值。例如,a[3]=5,表示给数组的第4个元素赋值。 小技巧:可以使用循环给数组元素全部或部分元素赋值,例如: for(int i=0;i<=99;i++) a[i]=i; 注意1:如果试图访问元素a[100],则发生数组越界的异常,显示信息的关键字为: array index out of bounds 注意2:Java中允许长度为0的数组的存在。例如在编写一个返回值为数组的方法时,如果返回值为为空,则允许返回长度(即数组元素)为0的数组。例如:new int[0] 二、数组的初始化即匿名数组 在Java中提供了一种创建数组并同时实例化的操作方式,这是一种数组实例化的简化形式。例如: int a[]={3,4,6,11,12} 用这种形式,还可以创建匿名数组,例如: new int[]{3,4,6,11,12} 用这种方式进行数组的实例化,数组元素的个数就是大括号中元素的个数。 小技巧:用这种方式可以在不增加变量名的情况下重新初始化一个数组。例如,下面的两种格式,效果是一样的。 格式一:传统的变量赋值格式 int a[],b[] a=new int[]{4,7,9,10,33}; b=a; 格式二:简化形式 int b[]; b=new int[]{4,7,9,10,33}; 三、for each循环与数组 从JDK5.0开始,引入了一种新的循环格式,即fo reach循环,这种循环常常与数组一起使用。下面是格式:

归并排序算法的原理及JAVA实现

归并排序是利用递归和分而治之的技术将数据序列划分成为越来越小的半子表,再对半子表排序,最后再用递归步骤将排好序的半子表合并成为越来越大的有序序列,归并排序包括两个步骤,分别为: 1)划分子表 2)合并半子表 首先我们来讨论归并算法,归并算法将一系列数据放到一个向量中,索引范围为[first,last],这个序列由两个排好序的子表构成,以索引终点(mid)为分界线,以下面一个序列为例 7,10,19,25,12,17,21,30,48 这样的一个序列中,分为两个子序列 7,10,19,25 和 12,17,21,30,48,如下图所示: 再使用归并算法的时候的步骤如下: 第一步:比较v[indexA]=7和v[indexB]=12,将较小的v[indexA]取出来放到临时向量tempArray中,然后indexA加1 第二步:比较v[indexA]=10和v[indexB]=12,将较小的10放到临时变量tempArray中,然后indexA++;

第三步:比较v[indexA]=19与v[indexB]=12,将较小的12存放到临时变量tempArray中,然后indexB++; 第四步到第七步:按照以上规则,进行比对和存储,得到如下结果: 最后一步:将子表b中剩余项添加到临时向量tempArray中 然后将临时变量中的值按照索引位置,拷贝回向量v中,就完成了对向量v 的归并排序 Java实现代码: package com.sort.merge; public class Merge { /** * 分治法,自顶向下,递归分割数组,最终归并 */ public static void merge(int[] arr,int start,int end){ if(start

如何击败JAVA自带排序算法

如何击败Java自带排序算法的 Java8对自带的排序算法进行了很好的优化。对于整形和其他的基本类型,Arrays.sort()综合利用了双枢轴快速排序、归并排序和启发式插入排序。这个算法是很强大的,可以在很多情况下通用。针对大规模的数组还支持更多变种。我拿自己仓促写的排序算法跟Java自带的算法进行了对比,看看能不能一较高下。这些实验包含了对特殊情况的处理。 首先,我编写了一个经典的快速排序算法。这个算法通过计算样本的平均值来估计整个数组的中心点,然后用作初始枢轴。 我借鉴了一些Java的思路来适当改进我的快速排序,修改后的算法在对小数组进行排序的时候直接调用了插入排序。在这种情况下,我的排序算法和Java的排序算法可以达到相同的运行时间量级。Wild&al指出,如果排序数组有很多的重复数据,标准的快速排序会比双枢轴的快速排序要快。我没有尝试任何字节或汇编级别的分析和优化。在大部分的问题中,我的版本的优化程序都远远不能跟Java系统程序相提并论。 我一直都想测试脑海里的一个简单的排序算法,我称之为Bleedsort。这是一个分布式算法,它通过样本抽样方法对要排序的数组进行分布估计,根据估计结果把数据分配到相应的一个临时的数组里(如图1所示),并重写这个初始的数组。这是一个预处理过程,然后再应用其他的排序算法分别进行排序。在我的测试中,我使用了我编写的快速排序版本。如果使用合并排序应该会有更好的结果,因为合并排序被广泛应用在高度结构化的数组中。为了计算简单,我只测试了分布均匀的数据。 Bleedsort在遇到相同的数据的时候都会放到右边,所以此算法在排序相对一致(译者注:会有很多重复数据)的数组的时候表现很差。所以我需要对排序的数组进行样本估计,当重复数很多的情况下应避免使用Bleedsort算法。 我很清楚,Bleedsort算法在内存空间使用方面没办法跟归并排序(快速排序)相提并论,临时数组也比原来的数组要大四倍左右。同时其他的一些分布排序算法,比如Flashsort,在这方面也表现得要好很多。 图1Bleedsort举例说明 我运用JMH来作为测试基准。为了简单起见,我就用整形数组进行测试。在1000.000到10.000.0000数量级的均匀分布的数组中,我的算法表现的最好。尽管我写的快速排序算法

相关主题
相关文档
最新文档