java通用的各种排序算法(改进版)
JAVA实现各种排序算法

{ System.out.print(data[k]+" ");
} }
四 、插入类排序-----希尔排序 希尔排序,也叫缩小增量排序 将待续按照某一种规则分为几个子序列,不断缩小规则,最后用一个直接插入排序合成 空间复杂度为 O(1),时间复杂度为 O(nlog2n) 算法先将要排序的一组数按某个增量 d(n/2,n 为要排序数的个数)分成若干组,每组中记
low = mid + 1; } //找到了要插入的位置,从该位置一直到插入数据的位置之间数据向后移动 for(int j = i; j >= low + 1; j--) data[j] = data[j - 1]; //low 已经代表了要插入的位置了 data[low] = temp; } for(int k=0;k<data.length;k++)
}
五 交换类排序-----冒泡排序 交换类排序核心就是每次比较都要进行交换 冒泡排序:是一种交换排序 每次比较若大小不同则就会发生交换,每一趟排序都能将一个元素放到它最终的位置!每
一趟就进行比较。 时间复杂度 O(n2),空间复杂度 O(1)
public static void bubbleSort(int[] a){ //从头开始两两比较,若前边值大则交换 否则,继续比较; // 只需记录需要交换的值 int tmp;
20 */
21 public static void max_heapify(int[] a, int i) {
22 int left = leftChild(i);
23 int right = rightChild(i);
24 int largest = 0;
Java常用排序总结

Java排序总结日常操作中常见的排序方法有:冒泡排序、快速排序、选择排序、插入排序、希尔排序,甚至还有基数排序、鸡尾酒排序、桶排序、鸽巢排序、归并排序等。
冒泡排序是一种简单的排序算法。
它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。
走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
代码/*** 冒泡法排序<br/>* <li>比较相邻的元素。
如果第一个比第二个大,就交换他们两个。
</li>* <li>对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。
在这一点,最后的元素应该会是最大的数。
</li>* <li>针对所有的元素重复以上的步骤,除了最后一个。
</li>* <li>持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
</li>** @param numbers* 需要排序的整型数组*/public static void bubbleSort(int[] numbers) {int temp; // 记录临时中间值int size = numbers.length; // 数组大小for(int i = 0; i < size - 1; i++) {for(int j = i + 1; j < size; j++) {if(numbers[i] < numbers[j]) { // 交换两数的位置temp = numbers[i];numbers[i] = numbers[j];numbers[j] = temp;}}}}快速排序使用分治法策略来把一个序列分为两个子序列。
代码/*** 快速排序<br/>* <ul>* <li>从数列中挑出一个元素,称为“基准”</li>* <li>重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。
java常用算法和数据结构

java常用算法和数据结构Java是一种面向对象的编程语言,它具有丰富的算法库和数据结构库,为开发人员提供了许多常用的算法和数据结构。
下面将介绍一些Java常用的算法和数据结构。
1.排序算法-冒泡排序(Bubble Sort):比较相邻的两个元素,如果顺序错误则交换位置,重复该过程直到整个序列有序。
-插入排序(Insertion Sort):将数组分为已排序和未排序两部分,每次从未排序部分取出一个元素,插入到已排序部分合适的位置。
-选择排序(Selection Sort):每次从未排序部分选择最小(或最大)的元素,放到已排序部分的末尾。
-快速排序(Quick Sort):选择一个基准元素,将数组分为两部分,小于基准的放左边,大于基准的放右边,递归地对左右两部分进行快速排序。
-归并排序(Merge Sort):将数组分为两部分,分别对每个子数组进行排序,然后合并两个有序子数组。
2.搜索算法-二分查找(Binary Search):对有序数组进行查找,每次将查找范围缩小一半。
-广度优先搜索(BFS):以树或图的形式搜索,从根节点开始,逐层扩展搜索范围,直到找到目标节点。
-深度优先搜索(DFS):以树或图的形式搜索,从根节点开始,逐个访问节点的所有邻居节点,直到找到目标节点或搜索完所有节点。
3.数据结构-数组(Array):一组按顺序存储的相同类型元素的集合,通过索引访问元素,可以快速访问元素,但插入和删除元素较慢。
-链表(Linked List):一组通过指针连接的节点存储的元素的集合,支持灵活的插入和删除操作,但访问元素较慢。
-栈(Stack):一种特殊的线性数据结构,遵循先进后出(LIFO)原则,只能在栈顶进行插入和删除操作。
-队列(Queue):一种特殊的线性数据结构,遵循先进先出(FIFO)原则,在队尾插入元素,队头删除元素。
-堆(Heap):一种特殊的树形数据结构,可以快速找到最小(或最大)元素,常用于实现优先队列。
java中的按字典排序方法

java中的按字典排序方法在Java中,可以使用不同的方法对字符串进行字典排序。
下面将介绍几种用于字典排序的常见方法。
1. 字符串数组排序如果有一个字符串数组需要进行字典排序,可以使用Arrays类中的sort()方法进行排序。
这个方法使用的是快速排序算法,可以对字符串数组按字典顺序进行排序。
例如:javaimport java.util.Arrays;public class DictionarySort {public static void main(String[] args) {String[] words = {"java", "c++", "python", "ruby"};字典排序Arrays.sort(words);输出排序结果for (String word : words) {System.out.println(word);}}}输出结果为:c++javapythonruby2. 字符串列表排序如果有一个字符串列表需要进行字典排序,也可以使用Collections类中的sort()方法进行排序。
这个方法使用的是归并排序算法,可以对字符串列表按字典顺序进行排序。
例如:javaimport java.util.ArrayList;import java.util.Collections;public class DictionarySort {public static void main(String[] args) {ArrayList<String> words = new ArrayList<>();words.add("java");words.add("c++");words.add("python");words.add("ruby");字典排序Collections.sort(words);输出排序结果for (String word : words) {System.out.println(word);}}}输出结果为:c++javapythonruby3. 自定义比较器排序如果想要根据自定义规则进行字典排序,可以实现Comparator接口并重写compare()方法。
用Java实现常见的8种内部排序算法

⽤Java实现常见的8种内部排序算法⼀、插⼊类排序插⼊类排序就是在⼀个有序的序列中,插⼊⼀个新的关键字。
从⽽达到新的有序序列。
插⼊排序⼀般有直接插⼊排序、折半插⼊排序和希尔排序。
1. 插⼊排序1.1 直接插⼊排序/*** 直接⽐较,将⼤元素向后移来移动数组*/public static void InsertSort(int[] A) {for(int i = 1; i < A.length; i++) {int temp = A[i]; //temp ⽤于存储元素,防⽌后⾯移动数组被前⼀个元素覆盖int j;for(j = i; j > 0 && temp < A[j-1]; j--) { //如果 temp ⽐前⼀个元素⼩,则移动数组A[j] = A[j-1];}A[j] = temp; //如果 temp ⽐前⼀个元素⼤,遍历下⼀个元素}}/*** 这⾥是通过类似于冒泡交换的⽅式来找到插⼊元素的最佳位置。
⽽传统的是直接⽐较,移动数组元素并最后找到合适的位置*/public static void InsertSort2(int[] A) { //A[] 是给定的待排数组for(int i = 0; i < A.length - 1; i++) { //遍历数组for(int j = i + 1; j > 0; j--) { //在有序的序列中插⼊新的关键字if(A[j] < A[j-1]) { //这⾥直接使⽤交换来移动元素int temp = A[j];A[j] = A[j-1];A[j-1] = temp;}}}}/*** 时间复杂度:两个 for 循环 O(n^2)* 空间复杂度:占⽤⼀个数组⼤⼩,属于常量,所以是 O(1)*/1.2 折半插⼊排序/** 从直接插⼊排序的主要流程是:1.遍历数组确定新关键字 2.在有序序列中寻找插⼊关键字的位置* 考虑到数组线性表的特性,采⽤⼆分法可以快速寻找到插⼊关键字的位置,提⾼整体排序时间*/public static void BInsertSort(int[] A) {for(int i = 1; i < A.length; i++) {int temp = A[i];//⼆分法查找int low = 0;int high = i - 1;int mid;while(low <= high) {mid = (high + low)/2;if (A[mid] > temp) {high = mid - 1;} else {low = mid + 1;}}//向后移动插⼊关键字位置后的元素for(int j = i - 1; j >= high + 1; j--) {A[j + 1] = A[j];}//将元素插⼊到寻找到的位置A[high + 1] = temp;}}2. 希尔排序希尔排序⼜称缩⼩增量排序,其本质还是插⼊排序,只不过是将待排序列按某种规则分成⼏个⼦序列,然后如同前⾯的插⼊排序⼀般对这些⼦序列进⾏排序。
java算法大全

java算法大全
Java算法大全可以包含许多不同的算法,包括排序算法、搜索算法、图算法等等。
下面是一些常见和常用的Java算法示例:
1. 排序算法:
- 冒泡排序
- 插入排序
- 选择排序
- 快速排序
- 归并排序
- 堆排序
2. 搜索算法:
- 二分查找
- 广度优先搜索(BFS)
- 深度优先搜索(DFS)
3. 图算法:
- 最短路径算法(如Dijkstra算法、Floyd-Warshall算法)
- 最小生成树算法(如Prim算法、Kruskal算法)
- 拓扑排序算法
4. 动态规划算法:
- 背包问题
- 最长上升子序列(LIS)问题
- 最长公共子序列(LCS)问题
5. 字符串算法:
- 字符串匹配(如暴力匹配、KMP算法、Boyer-Moore
算法)
- 字符串排序(如基数排序)
6. 数值算法:
- 求解线性方程组
- 求解方程的根
- 求解数值积分
以上只是一些常见的算法示例,Java算法的范围非常广泛,涉及到各种不同的问题和应用领域。
如果你有特定的算法
需求,可以提供更具体的问题描述,我可以为你提供更详
细的解答。
JAVA语言的常见排序算法
JAVA语言的常见排序算法JAVA语言的常见排序算法导语:每种排序算法都有它自己的优点及局限性,适用于不同的要求范围,在选择时应根据需要适当选用,甚至可将多种算法结合起来使用,效率才会更高。
下面就由店铺为大家介绍一下JAVA语言的常见排序算法,欢迎大家阅读!1 排序算法概述计算机中的排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。
而排序算法则是一种能将一串数据依照特定的方式进行排序的一种算法。
根据排序过程中涉及的存储器不同,可以将排序方法分为两大类:一类是内部排序,指的是待排序地记录存放在计算机随机存储器中进行的排序过程。
另一类是外部排序,指的是需要对外存储器进行访问的排序过程。
该课题主要研究几类常见的内部排序,有冒泡排序、插入排序、选择排序、归并排序。
2 常见排序算法基本思想和JAVA代码实现2.1 冒泡排序2.1.1 基本思想冒泡排序是将相邻的两个记录按关键值两两比较,如果记录的次序相反时即进行交换,直到序列中不存在反序的记录为止。
如有n个无序数,第一趟将第一个和第二个进行比较,将大的放在第二个位置,再将第二个和第三比较,大的放在第三个位置,依次向后比较,比较n-1次,将最大的放在最后(n的位置);第二趟,再从第一个开始比较,比较n-2次,这次把最大的放到第n-1个位置,然后再来回比较。
遵循第i次遍历就从第一个数开始比较n-i次,将最后的值放在第n-i+1的位置。
如图1、图2所示。
2.1.2 JAVA语言实现冒泡排序核心代码//冒泡排序:10万个随机数用时约25秒public static voidbubblesort (int a[]){inti,j,temp;int n=a。
length; //获得数组长度for(i=1;i<=n;i++){ //外层循环控制比较趟数for( j=0;j if(a[j]>a[j+1]){//如果相邻两数前者比后者大,那交换temp=a[j];a[j]=a[j+1];a[j+1]=temp;}}}}2.2 插入排序2.2.1 基本思想插入排序是一种简单的排序方法,它的基本排序思想是依次将待排序的记录逐一地按其关键字值的大小插入到一个已排好序的有序序列中,得到一个新的有序序列,直到所有的记录插完为止,从而实现排序。
java排序算法代码
java排序算法代码java排序算法代码介绍排序是一种常用的算法,常被用于数据结构操作当中。
是把一组数据根据某种特定顺序重新排列的过程。
排序算法的实现有很多种,比如冒泡排序,快速排序,插入排序等。
今天我们就来讨论在java中的排序算法的实现。
Java中的排序算法Java提供了几种排序算法,它们都可以用于排序集合或数组。
1、冒泡排序:冒泡排序(Bubble Sort)是一种算法,它采用多次比较和交换的方法来排序。
它的特点是从头开始,将最大或最小的值交换到最后,它的基本框架如下:// 用于排序的内部循环for (int i = 0; i < n - 1; i++){// 用于交换的内部循环for (int j = 0; j < n - 1 - i; j++) : {// 执行比较和交换if (a[j] > a[j + 1]){int temp = a[j];a[j] = a[j + 1];a[j + 1] = temp;}}}2、快速排序:快速排序(Quick Sort)是一种分治算法,它将一个数组分成两个子数组,其中一个子数组中的元素都比另一个子数组中的元素都要小。
步骤如下:1)选择一个基准元素,通常选择第一个元素或者最后一个元素。
2)比较基准元素与其他元素的值,将小于基准元素的放在基准元素的前面,大于基准元素的放到基准元素的后面。
3)对分出来的小数组重复之前的步骤,直到所有的小数组只剩下一个元素为止。
这里提供一段java实现快速排序算法的代码:public static void quickSort(int[] arr, int low, int high) {if (arr == null || arr.length == 0)return;if (low >= high)return;// 选择基准元素int middle = low + (high - low) / 2;int pivot = arr[middle];// 将arr[i] < pivot 的放到左边,将arr[i] > pivot 的放到右边int i = low, j = high;while (i <= j){while (arr[i] < pivot)i++;while (arr[j] > pivot)j--;if (i <= j){int temp = arr[i];arr[i] = arr[j];arr[j] = temp;i++;j--;}}// 递归if (low < j)quickSort(arr, low, j);if (high > i)quickSort(arr, i, high);}3、插入排序:插入排序(Insertion Sort)是一种基本排序算法,其原理非常简单,首先从第一个元素开始,认为第一个元素已经排好序,然后选择第二个元素,把第二个元素与第一个比较,如果比第一个元素小,就交换两个元素的位置,然后再把第三个元素与前两个比较,以此类推。
java 排序算法代码大全
java 排序算法代码大全本文将介绍Java中常用的排序算法,包括冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序、堆排序、计数排序和基数排序。
每种排序算法都将附上详细的Java 代码示例。
1. 冒泡排序冒泡排序是最简单的排序算法,它每次将相邻的两个数比较,如果顺序不对,则交换它们的位置。
该算法的时间复杂度为O(n^2)。
Java代码示例:```javapublic class BubbleSort {public static void bubbleSort(int[] nums) {int n = nums.length;for (int i = 0; i < n - 1; i++) {for (int j = 0; j < n - i - 1; j++) {if (nums[j] > nums[j + 1]) {int temp = nums[j];nums[j] = nums[j + 1];nums[j + 1] = temp;}}}}}```2. 选择排序选择排序通过不断选出未排序部分的最小元素,放到已排序部分的末尾,来达到排序的目的。
该算法的时间复杂度也为O(n^2)。
3. 插入排序插入排序将待排序的数据分为已排序和未排序两个部分,每次将未排序部分中的第一个元素插入到已排序部分中的正确位置。
该算法的时间复杂度为O(n^2)。
4. 希尔排序希尔排序是插入排序的改进版,它将待排序的数据分成若干个子序列,对每个子序列进行插入排序,最后合并成一个完整的有序序列。
该算法的时间复杂度为O(n log n)。
5. 快速排序6. 归并排序堆排序是利用堆这种数据结构进行排序的算法,堆可以看作一棵完全二叉树,每个结点的值都大于或等于(小于或等于)其左右子节点的值。
堆排序分为大根堆排序和小根堆排序,时间复杂度为O(n log n)。
8. 计数排序计数排序是一种线性时间复杂度的排序算法,它利用一个计数数组来统计每个元素出现的次数,然后逐个将这些元素放入结果数组中。
java中的几种排序方法
}
}
}
}
选择排序:
package org.rut.util.algorithm.support;
import org.rut.util.algorithm.SortUtil;
public class SelectionSort implements SortUtil.Sort {
if (data[j] < data[lowIndex]) {
lowIndex = j;
}
}
SortUtil.swap(data,i,lowIndex);
return l; Fra bibliotek } }
改进后的快速排序:
package org.rut.util.algorithm.support;
import org.rut.util.algorithm.SortUtil;
public class ImprovedQuickSort implements SortUtil.Sort {
}
private void insertSort(int[] data) {
int temp;
for(int i=1;i<data.length;i++){
for(int j=i;(j>0)&&(data[j]<data[j-1]);j--){
public void sort(int[] data) {
int temp;
for (int i = 0; i < data.length; i++) {
int lowIndex = i;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
java通用的各种排序算法(改进版). 2007年08月11日星期六19:26 import java.io.*;
interface Item
{
public boolean less(Item v);
}
class Recod
{
int id;
String name;
double balance;
static int flag=2;
}
class Sort
{
static boolean less(Item v,Item w)
{
return v.less(w);
}
static void compExch(Item a[],int i,int j) {
if(less(a[i],a[j]))
exch(a,i,j);
}
static void exch(Item a[],int i,int j)
{
Item t=a[i]; a[i]=a[j]; a[j]=t;
}
//选择排序
static void selSort(Item a[],int l,int r) {
for(int i=l;i<=r;i++)
{
int max=i;
for(int j=i+1;j<=r;j++)
{
if(less(a[max],a[j])) max=j;
}
if(max!=i)
exch(a,i,max);
}
}
//冒泡
static void maoSort(Item a[],int l,int r) {
for(int i=l;i<=r;i++)
{
int flag=1;
for(int j=r;j>i;j--)
{
if(less(a[j-1],a[j]))
{
exch(a,j-1,j);
flag=0;
}
}
if(flag==1) break;
}
}
//插入
static void insertSort(Item a[],int l,int r) {
Item item;
int j=0;
for(int i=1+l;i<=r;i++)
{
item=a[i];
j=i-1;
while(j>=l && less(a[j],item))
{
a[j+1]=a[j];
j--;
}
a[j+1]=item;
}
}
//快排(三路取中加小文件截断) static void quickSort(Item a[],int l,int r) {
if((r-l)<=10) insertSort(a,l,r);
else
{
if(l<r)
{
int i=l,j=r,k=(l+r)/2;
compExch(a,r,k);
compExch(a,r,l);
compExch(a,k,l);
exch(a,k,l);
Item item=a[i];
while(i!=j)
{
while(i<j && less(a[j],item))
j--;
if(i<j)
{
a[i]=a[j];
i++;
}
while(i<j && less(item,a[i]))
i++;
if(i<j)
{
a[j]=a[i];
j--;
}
}
a[i]=item;
quickSort(a,l,i-1);
quickSort(a,i+1,r);
}
}
}
//希尔排序
static void shellSort(Item a[],int l,int r) {
int d=r/2;
Item item;
while(d>0)
{
for(int i=d;i<=r;i++)
{
int j=i-d;
while(j>=l && less(a[j],a[j+d]))
{
item=a[j];
a[j]=a[j+d];
a[j+d]=item;
j=j-d;
}
}
d=d/2;
}
}
}
public class Quick extends Recod implements Item
{
public boolean less(Item v)
{
Quick qu=(Quick)v;
switch(flag)
{
case 2: return id<qu.id;
case 1: return pareTo()<0;
default:return balance<qu.balance;
}
}
public static void main(String[]args)
{
Quick a[]=new Quick[2000];
for(int i=0;i<2000;i++)
{
a[i]=new Quick();
a[i].id=(int)(1+Math.round(Math.random()*100));
a[i].name="ren"+String.valueOf(i);
a[i].balance=10+Math.random()*100;
System.out.println(a[i].id+" "+a[i].balance);
}
Sort.quickSort(a,0,1999);
System.out.println("**************");
if(flag==2)
for(int j=0;j<2000;j++)
{
System.out.println(a[j].id+" "+a[j].name);
}
else
{
for(int j=0;j<2000;j++)
System.out.println(a[j].balance+" "+a[j].name);
}
}
}
附加:
JA V A 2应用编程150例。