java排序算法实现代码
JAVA排序算法实现代码-快速(Quick Sort)排序
- /**
- * JAVA排序算法实现代码-快速(Quick Sort)排序。
- *
- * @author 老紫竹 JAVA世纪网(java2000.net)
- *
- */
public class Test {
public static int[] a = { 10, 32, 1, 9, 5, 7, 12, 0, 4, 3 }; // 预设数据数组
public static void main(String args[]) {
System.out.print("排序前: ");
for (int i = 0; i < a.length; i++)
System.out.printf("%3s", a[i]);
System.out.println("");
int Index = a.length;
QuickSort(0, Index - 1, Index); // 快速排序
// 排序后结果
System.out.print("排序后: ");
for (int i = 0; i < a.length; i++)
System.out.printf("%3s", a[i]);
System.out.println("");
- }
public static void QuickSort(int Left, int Right, int Index) {
int i, j, k; // 循环计数变量
int Pivot; // 枢纽变量
int Temp; // 暂存变量
i = Left; // 设定左指针
j = Right; // 设定右指针
Pivot = a[Left]; // 取最左边的元素
if (i < j) {
do {
while (a[i] <Pivot && i < Right) // 从左往右找比Pivot大的值
- {
- i++;
- }
while (a[j] > Pivot && j > Left) // 从右往左找比Pivot小的值
- {
- j--;
- }
if (i < j) // 交换a[i]和a[j]
- {
- Temp = a[i];
- a[i] = a[j];
- a[j] = Temp;
- }
} while (i < j);
if (i > j) {
Temp = a[Left]; // 交换a[Left]和a[j]
- a[Left] = a[j];
- a[j] = Temp;
// 打印目前排序结果
System.out.print("排序中: ");
for (k = 0; k <= Index; k++) {
System.out.printf("%3s", a[k]);
- }
System.out.println("");
- }
QuickSort(Left, j - 1, Index); // 排序左半边
QuickSort(j + 1, Right, Index); // 排序右半边
- }
- }
- }
运行结果
排序前: 10 32 1 9 5 7 12 0 4 3
排序后: 0 1 3 4 5 7 9 10 12 32
JAVA排序算法实现代码-冒泡(Bubble Sort)排序
- /**
- * JAVA排序算法实现代码-冒泡(Bubble Sort)排序。
- *
- * @author 老紫竹 JAVA世纪网(java2000.net)
- *
- */
public class Test {
public static void main(String[] args) {
int[] a = { 10, 32, 1, 9, 5, 7, 12, 0, 4, 3 };
System.out.print("排序前: ");
for (int i = 0; i < a.length; i++)
System.out.printf("%3s", a[i]);
- System.out.println();
Test test = new Test();
- test.bubbleSort(a);
System.out.print("排序后: ");
for (int i = 0; i < a.length; i++)
System.out.printf("%3s", a[i]);
- System.out.println();
- }
public void bubbleSort(int[] a) {
int len = a.length;
System.out.println("数组大小是:" + len);
boolean change = false;
int temp;
int count = 0;
for (int i = len; i > 1; i--) {
for (int j = 0; j < i - 1; j++) {
if (a[j + 1] < a[j]) {
temp = a[j + 1];
a[j + 1] = a[j];
- a[j] = temp;
change = true;
- count++;
- }
- }
if (change) {
System.out.print("第" + count + "趟交换: ");
for (int k = 0; k < len; k++)
System.out.print(a[k] + " ");
- System.out.println();
- }
- }
- }
- }
运行结果
排序前: 10 32 1 9 5 7 12 0 4 3
数组大小是:10
第8趟交换: 10 1 9 5 7 12 0 4 3 32
第15趟交换: 1 9 5 7 10 0 4 3 12 32
第20趟交换: 1 5 7 9 0 4 3 10 12 32
第23趟交换: 1 5 7 0 4 3 9 10 12 32
第26趟交换: 1 5 0 4 3 7 9 10 12 32
第29趟交换: 1 0 4 3 5 7 9 10 12 32
第31趟交换: 0 1 3 4 5 7 9 10 12 32
第31趟交换: 0 1 3 4 5 7 9 10 12 32
第31趟交换: 0 1 3 4 5 7 9 10 12 32
排序后: 0 1 3 4 5 7 9 10 12 32
JAVA排序算法实现代码-堆(Heap)排序
- /**
- * JAVA排序算法实现代码-堆(Heap)排序。
- *
- * @author 老紫竹 JAVA世纪网(java2000.net)
- *
- */
public class Test {
public static int[] Heap = { 10, 32, 1, 9, 5, 7, 12, 0, 4, 3 }; // 预设数据数组
public static void main(String args[]) {
int i; // 循环计数变量
int Index = Heap.length; // 数据索引变量
System.out.print("排序前: ");
for (i = 1; i < Index - 1; i++)
System.out.printf("%3s", Heap[i]);
System.out.println("");
HeapSort(Index - 2); // 堆排序
System.out.print("排序后: ");
for (i = 1; i < Index - 1; i++)
System.out.printf("%3s", Heap[i]);
System.out.println("");
- }
/**
- * 建立堆
- */
public static void CreateHeap(int Root, int Index) {
int i, j; // 循环计数变量
int Temp; // 暂存变量
int Finish; // 判断堆是否建立完成
j = 2 * Root; // 子节点的Index
Temp = Heap[Root]; // 暂存Heap的Root 值
Finish = 0; // 预设堆建立尚未完成
while (j <= Index && Finish == 0) {
if (j < Index) // 找最大的子节点
if (Heap[j] < Heap[j + 1])
- j++;
if (Temp >= Heap[j])
Finish = 1; // 堆建立完成
else {
Heap[j / 2] = Heap[j]; // 父节点 = 目前节点
j = 2 * j;
- }
- }
Heap[j / 2] = Temp; // 父节点 = Root值
- }
public static void HeapSort(int Index) {
int i, j, Temp;
// 将二叉树转成Heap
for (i = (Index / 2); i >= 1; i--)
- CreateHeap(i, Index);
// 开始进行堆排序
for (i = Index - 1; i >= 1; i--) {
Temp = Heap[i + 1]; // Heap的Root值和最后一个值交换
Heap[i + 1] = Heap[1];
Heap[1] = Temp;
CreateHeap(1, i); // 对其余数值重建堆
System.out.print("排序中: ");
for (j = 1; j <= Index; j++)
System.out.printf("%3s",Heap[j]);
System.out.println("");
- }
- }
- }
运行结果
排序前: 32 1 9 5 7 12 0 4
排序中: 12 7 9 5 1 4 0 32
排序中: 9 7 4 5 1 0 12 32
排序中: 7 5 4 0 1 9 12 32
排序中: 5 1 4 0 7 9 12 32
排序中: 4 1 0 5 7 9 12 32
排序中: 1 0 4 5 7 9 12 32
排序中: 0 1 4 5 7 9 12 32
排序后: 0 1 4 5 7 9 12 32
JAVA排序算法实现代码-选择(Select)式排序
- /**
- * JAVA排序算法实现代码-选择(Select)式排序。
- *
- * @author 老紫竹 JAVA世纪网(java2000.net)
- *
- */
public class Test {
public static int[] a = { 10, 32, 1, 9, 5, 7, 12, 0, 4, 3 }; // 预设数据数组
public static void main(String args[]) {
int i; // 循环计数变量
int Index = a.length;// 数据索引变量
System.out.print("排序前: ");
for (i = 0; i < Index - 1; i++)
System.out.printf("%3s", a[i]);
System.out.println("");
SelectSort(Index - 1); // 选择排序
// 排序后结果
System.out.print("排序后: ");
for (i = 0; i < Index - 1; i++)
System.out.printf("%3s", a[i]);
System.out.println("");
- }
public static void SelectSort(int Index) {
int i, j, k; // 循环计数变量
int MinValue; // 最小值变量
int IndexMin; // 最小值索引变量
int Temp; // 暂存变量
for (i = 0; i < Index - 1; i++) {
MinValue = 32767; // 目前最小数值
IndexMin = 0; // 储存最小数值的索引值
for (j = i; j < Index; j++) {
if (a[j] < MinValue) // 找到最小值
- {
MinValue = a[j]; // 储存最小值
- IndexMin = j;
- }
Temp = a[i]; // 交换两数值
- a[i] = a[IndexMin];
- a[IndexMin] = Temp;
- }
System.out.print("排序中: ");
for (k = 0; k < Index; k++)
System.out.printf("%3s", a[k]);
System.out.println("");
- }
- }
- }
运行结果
排序前: 10 32 1 9 5 7 12 0 4
排序中: 1 32 10 9 5 7 12 0 4
排序中: 1 5 32 10 9 7 12 0 4
排序中: 1 5 9 32 10 7 12 0 4
排序中: 1 5 9 10 32 7 12 0 4
排序中: 1 5 9 10 32 7 12 0 4
排序中: 1 5 9 10 32 7 12 0 4
排序中: 1 5 9 10 32 7 12 0 4
排序中: 1 5 9 10 32 7 12 0 4
排序后: 1 5 9 10 32 7 12 0 4
JAVA排序算法实现代码-二叉树排序
- /**
- * JAVA排序算法实现代码-二叉树排序。
- *
- * @author 老紫竹 JAVA世纪网(java2000.net)
- *
- */
public class Test {
public static int[] a = { 0, 10, 32, 1, 9, 5, 7, 12, 2, 4, 3 }; // 预设数据数组
public static int[] Data = new int[20]; // 预设数据数组
public static void main(String args[]) {
int i; // 循环计数变量
int Index = 1; // 数据索引变量
BNTreeArray BNTree = new BNTreeArray(); // 声明二叉树数组
- Data[Index] = a[Index];
BNTreeArray.TreeData[0] = Data[Index];
- Index++;
for (i = 2; i < a.length; i++) {
- Data[Index] = a[Index];
BNTree.Create(Data[Index]); // 建立二叉查找树
- Index++;
- }
// 排序前数据内容
System.out.print("排序前 : ");
for (i = 1; i < Index; i++)
System.out.print(" " + Data[i] + " ");
System.out.println("");
// 排序后结果
System.out.print("排序后 : ");
BNTreeArray.InOrder(0); // 中序遍历
- }
- }
class BNTreeArray {
public static int MaxSize = 20;
public static int[] TreeData = new int[MaxSize];
public static int[] RightNode = new int[MaxSize];
public static int[] LeftNode = new int[MaxSize];
public BNTreeArray() {
int i; // 循环计数变量
for (i = 0; i < MaxSize; i++) {
TreeData[i] = 0;
RightNode[i] = -1;
LeftNode[i] = -1;
- }
- }
// ----------------------------------------------------
// 建立二叉树
// ----------------------------------------------------
public void Create(int Data) {
int i; // 循环计数变量
int Level = 0; // 树的阶层数
int Position = 0;
for (i = 0; TreeData[i] != 0; i++)
- ;
- TreeData[i] = Data;
while (true) // 寻找节点位置
- {
// 判断是左子树或是右子树
if (Data > TreeData[Level]) {
// 右树是否有下一阶层
if (RightNode[Level] != -1)
- Level = RightNode[Level];
else {
Position = -1; // 设定为右树
break;
- }
} else {
// 左树是否有下一阶层
if (LeftNode[Level] != -1)
- Level = LeftNode[Level];
else {
Position = 1; // 设定为左树
break;
- }
- }
- }
if (Position == 1) // 建立节点的左右连结
LeftNode[Level] = i; // 连结左子树
else
RightNode[Level] = i; // 连结右子树
- }
// ---------------------------------------------------------
// 二叉树中序遍历
// ---------------------------------------------------------
public static void InOrder(int Pointer) {
if (Pointer != -1) // 遍历的终止条件
- {
InOrder(LeftNode[Pointer]); // 处理左子树
// 处理打印节点内容
System.out.print(" " + TreeData[Pointer] + " ");
InOrder(RightNode[Pointer]); // 处理右子树
- }
- }
- }
运行结果
排序前 : 10 32 1 9 5 7 12 2 4 3
排序后 : 1 2 3 4 5 7 9 10 12 32
JAVA排序算法实现代码-希尔Shell排序
- /**
- * JAVA排序算法实现代码-希尔Shell排序。
- *
- * @author 老紫竹 JAVA世纪网(java2000.net)
- *
- */
public class Test {
public static int[] a = { 10, 32, 1, 9, 5, 7, 12, 0, 4, 3 }; // 预设数据数组
public static void main(String args[]) {
int i; // 循环计数变量
int Index = a.length;// 数据索引变量
System.out.print("排序前: ");
for (i = 0; i < Index - 1; i++)
System.out.printf("%3s ", a[i]);
System.out.println("");
ShellSort(Index - 1); // 选择排序
// 排序后结果
System.out.print("排序后: ");
for (i = 0; i < Index - 1; i++)
System.out.printf("%3s ", a[i]);
System.out.println("");
- }
public static void ShellSort(int Index) {
int i, j, k; // 循环计数变量
int Temp; // 暂存变量
boolean Change; // 数据是否改变
int DataLength; // 分割集合的间隔长度
int Pointer; // 进行处理的位置
DataLength = (int) Index / 2; // 初始集合间隔长度
while (DataLength != 0) // 数列仍可进行分割
- {
// 对各个集合进行处理
for (j = DataLength; j < Index; j++) {
Change = false;
Temp = a[j]; // 暂存Data[j]的值,待交换值时用
Pointer = j - DataLength; // 计算进行处理的位置
// 进行集合内数值的比较与交换值
while (Temp < a[Pointer] && Pointer >= 0 && Pointer <= Index) {
- a[Pointer + DataLength] = a[Pointer];
// 计算下一个欲进行处理的位置
- Pointer = Pointer - DataLength;
Change = true;
if (Pointer < 0 || Pointer > Index)
break;
- }
// 与最后的数值交换
- a[Pointer + DataLength] = Temp;
if (Change) {
// 打印目前排序结果
System.out.print("排序中: ");
for (k = 0; k < Index; k++)
System.out.printf("%3s ", a[k]);
System.out.println("");
- }
- }
DataLength = DataLength / 2; // 计算下次分割的间隔长度
- }
- }
- }
运行结果
排序前: 10 32 1 9 5 7 12 0 4
排序中: 5 32 1 9 10 7 12 0 4
排序中: 5 7 1 9 10 32 12 0 4
排序中: 5 7 1 0 10 32 12 9 4
排序中: 4 7 1 0 5 32 12 9 10
排序中: 1 7 4 0 5 32 12 9 10
排序中: 1 0 4 7 5 32 12 9 10
排序中: 1 0 4 7 5 9 12 32 10
排序中: 1 0 4 7 5 9 10 32 12
排序中: 0 1 4 7 5 9 10 32 12
排序中: 0 1 4 5 7 9 10 32 12
排序中: 0 1 4 5 7 9 10 12 32
排序后: 0 1 4 5 7 9 10 12 32
JAVA排序算法实现代码-插入排序
- /**
- * JAVA排序算法实现代码-插入排序。
- *
- * @author 老紫竹 JAVA世纪网(java2000.net)
- *
- */
public class Test {
public static int[] a = { 10, 32, 1, 9, 5, 7, 12, 0, 4, 3 }; // 预设数据数组
public static void main(String args[]) {
int i; // 循环计数变量
int Index = a.length;// 数据索引变量
System.out.print("排序前: ");
for (i = 0; i < Index - 1; i++)
System.out.print(" " + a[i] + " ");
System.out.println("");
InsertSort(Index - 1); // 选择排序
// 排序后结果
System.out.print("排序后: ");
for (i = 0; i < Index - 1; i++)
System.out.print(" " + a[i] + " ");
System.out.println("");
- }
public static void InsertSort(int Index) {
int i, j, k; // 循环计数变量
int InsertNode; // 欲插入数据变量
for (i = 1; i < Index; i++) // 依序插入数值
- {
InsertNode = a[i]; // 设定欲插入的数值
j = i - 1; // 欲插入数组的开始位置
// 找适当的插入位置
while (j >= 0 && InsertNode < a[j]) {
a[j + 1] = a[j];
- j--;
- }
a[j + 1] = InsertNode; // 将数值插入
// 打印目前排序结果
System.out.print("排序中: ");
for (k = 0; k < Index; k++)
System.out.print(" " + a[k] + " ");
System.out.println("");
- }
- }
- }
运行结果
排序前: 10 32 1 9 5 7 12 0 4
排序中: 10 32 1 9 5 7 12 0 4
排序中: 1 10 32 9 5 7 12 0 4
排序中: 1 9 10 32 5 7 12 0 4
排序中: 1 5 9 10 32 7 12 0 4
排序中: 1 5 7 9 10 32 12 0 4
排序中: 1 5 7 9 10 12 32 0 4
排序中: 0 1 5 7 9 10 12 32 4
排序中: 0 1 4 5 7 9 10 12 32
排序后: 0 1 4 5 7 9 10 12 32
排序算法总结
排序法
平均时间
最差情形
稳定度
额外空间
备注
冒泡
O(n2)
O(n2)
稳定
O(1)
n小时较好
交换
O(n2)
O(n2)
不稳定
O(1)
n小时较好
选择
O(n2)
O(n2)
不稳定
O(1)
n小时较好
插入
O(n2)
O(n2)
稳定
O(1)
大部分已排序时较好
基数
O(logRB)
O(logRB)
稳定
O(n)
B是真数(0-9),R是基数(个十百)
Shell
O(nlogn)
O(ns) 1<s<2
不稳定
O(1)
s是所选分组
快速
O(nlogn)
O(n2)
不稳定
O(nlogn)
n大时较好
归并
O(nlogn)
O(nlogn)
稳定
O(1)
n大时较好
堆
O(nlogn)
O(nlogn)
不稳定
O(1)
n大时较好
以上是 java排序算法实现代码 的全部内容, 来源链接: utcz.com/z/392181.html