package com.algorithem.sort;
/*
*各种排序算法之我理解:
*选择排序:我认为这是最容易掌握的一种排序算法,其核心思想就是每一次都是从当前位置起到最后位置止,选取最大的或最小的放在当前位置;
*冒泡排序:进行N-1次冒泡,每一次冒泡都将该范围内最大或量小的往上送,其实现手段是通过交换相邻位置的数来实现的;
*插入排序:其核心思想是假定前面的数已经是有序的,只需把当前数插入前面的有序序列即可。其核心操作是数组的插入运算;
*快速排序:其核心思想是分治,是二分思想的应用,实现手段递归,是平均时间效率最高的排序算法.
*
*/
//常用排序算法小集,分别给出了升序与降序的方法,由flag进分升降区别
public class Sort {
// 选择排序,flag用来标志是进行升序排序还是降序排序
public static void chooseSort(int[] a, int flag) {
int n = a.length - 1; // length是数组的一个属性,而不是通过方法获取
for (int i = 0; i < n; i++) {
int max = a[i], k = i;
for (int j = i + 1; j <= n; j++) {
if (flag >= 0) {
if (a[j] >= max) {
k = j;
max = a[j];
}
} else {
if (a[j] <= max) {
k = j;
max = a[j];
}
}
}
if (k != i) {
int t = a[k];
a[k] = a[i];
a[i] = t;
}
}
}
// 冒泡排序,将大水泡或小水泡往上冒
public static void maopaoSort(int[] a, int flag) {
int n = a.length - 1;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n - i; j++) {
if (flag >= 0) {
if (a[j] <= a[j + 1]) {
int t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
} else {
if (a[j] >= a[j + 1]) {
int t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
}
}
// 插入法排序
public static void insertSort(int[] a, int flag) {
int n = a.length - 1, i, j, k, temp;
for (i = 0; i <= n; i++) {
for (j = 0; j <= i - 1; j++) {
if (flag <= 0) {
if (a[i] <= a[j]) {
break;
}
} else {
if (a[i] >= a[j]) {
break;
}
}
}
temp = a[i];
for (k = i - 1; k >= j; k--) {
a[k + 1] = a[k];
}
if (j >= 0 && j <= n)
a[j] = temp;
}
}
// 快速排序,其中划分函数是重点
public static void quickSort(int[] a, int flag) {
quicksort(a, 0, a.length - 1, flag);
}
public static void quicksort(int[] a, int low, int high, int flag) {
if (low <= high) {
int point = divide(a, low, high, flag);
quicksort(a, low, point - 1, flag);
quicksort(a, point + 1, high, flag);
}
}
public static int divide(int[] a, int low, int high, int flag) {
int point = a[low];
while (low < high) {
if (flag <= 0) {
while (a[high] >= point && high > low)
high--;
a[low] = a[high];
while (a[low] <= point && low < high)
low++;
a[high] = a[low];
} else {
while (a[high] <= point && high > low)
high--;
a[low] = a[high];
while (a[low] >= point && low < high)
low++;
a[high] = a[low];
}
}
a[high] = point;
return high;
}
public static void main(String[] args) {
int[] a = { 1, 3, 4, 6, 7, 9, 9, 12, 44, 3, 6, 34 };
// Sort.chooseSort(a, -1);
// for (int i : a) {
// System.out.print(i + " ");
// }
// System.out.println();
// Sort.chooseSort(a, 1);
// for (int i : a) {
// System.out.print(i + " ");
// }
// System.out.println();
// Sort.maopaoSort(a,1);
// for (int i : a) {
// System.out.print(i + " ");
// }
// System.out.println();
// Sort.insertSort(a,1);
// for (int i : a) {
// System.out.print(i + " ");
// }
// System.out.println();
// 测试快排升序
Sort.quickSort(a, -1);
for (int i : a) {
System.out.print(i + " ");
}
System.out.println();
// 测试快排降序
Sort.quickSort(a, 1);
for (int i : a) {
System.out.print(i + " ");
}
System.out.println();
}
}
分享到:
相关推荐
2.可以支持升序、降序、字典排序等多种顺序要求 3.可以随意增加排序算法和顺序要求,保证其他程序不修改 4.减少程序代码中逻辑上的冗余 5.至少用两种方案编程实现该程序包,并说明两个方案的优缺点 6.提交设计报告,...
VBA 数组的升序、降序排序 VBA 数组的升序、降序排序是 VBA 编程中的一种常见操作,用于对数组中的元素进行排序。本文将介绍 VBA 数组的升序和降序排序的方法,并提供相应的代码示例。 一、升序排序 升序排序是指...
冒泡排序是一种基础且经典的排序算法,其工作原理是通过重复遍历待排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成...
冒泡排序是一种基础且历史悠久的排序算法,它通过重复遍历待排序的序列,比较相邻元素并根据需要交换它们的位置来实现排序。在JavaScript中,我们可以轻松地实现这个算法,来对数组进行升序或降序排列。接下来,我们...
2.可以支持升序、降序、字典排序等多种顺序要求 3.可以随意增加排序算法和顺序要求,保证其他程序不修改 4.减少程序代码中逻辑上的冗余 5.至少用两种方案编程实现该程序包,并说明两个方案的优缺点 包括实验报告...
堆排序是一种高效的排序算法,基于二叉堆数据结构。二叉堆可以分为最大堆和最小堆,其中最大堆中每个节点的值都大于或等于其子节点,而最小堆则相反。在Java中,实现堆排序通常涉及构建堆和进行排序两个主要步骤。 ...
本篇我们将深入探讨TIA博途SCL语言中的冒泡排序算法,并介绍如何创建一个全局函数块(FC)库,实现升序或降序的排序功能。 冒泡排序是一种简单但效率较低的排序算法,它的基本思想是通过重复遍历待排序的序列,比较...
本篇文章将深入探讨TIA博途SCL语言中的快速排序算法,以及如何将其封装为一个全局功能块(FC)库文件,以便在项目中重复使用,并支持升序或降序排列。 快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. ...
接下来,我们将深入探讨冒泡排序算法以及如何实现升序和降序排序。 **冒泡排序** 是一种基础的排序算法,它的名字来源于排序过程中较小的元素像气泡一样逐渐“浮”到数组的顶端。冒泡排序的工作原理是通过比较相邻...
树型框超快排序是一种结合了树结构与快速排序算法的优化策略。快速排序是一种基于分治思想的排序算法,由C.A.R. Hoare在1960年提出,其基本步骤包括选取一个基准元素、划分数组以及递归地对划分后的子数组进行排序。...
在IT领域,排序算法是计算机科学中的基础概念,它们用于对数据进行有序排列。这个压缩包文件"sorting-algorithms"包含了一些经典的排序算法实现,主要用JavaScript编写,旨在帮助开发者理解并掌握这些算法的工作原理...
**选择排序算法详解** 选择排序(Selection Sort)是一种简单直观的排序算法,它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。选择...
在探讨C++冒泡排序这一知识点时,我们不仅会深入理解冒泡排序的基本原理、算法实现,还会细致分析如何在C++中灵活运用该算法进行数据的升序或降序排列。冒泡排序是一种简单的排序算法,其基本思想是通过重复地走访待...
选择排序:void SelectSort(int L[],int n) 插入排序:void InsertSort(int L[], int n) 冒泡排序:void BubbleSort(int L[],int n) 快速排序:void QuickSort(int L[],int first,int last) 归并排序:void ...
4. **稳定性**:JavaScript的`sort()`方法不是稳定的排序算法,意味着相等的元素可能会交换它们的顺序。这通常不会造成问题,但如果排序稳定性很重要,可能需要寻找其他解决方案。 ### 结论 掌握JavaScript中的...
【VB做的一个排序算法】 VB,全称Visual Basic,是由微软公司推出的面向对象的编程语言,它是基于Basic语言的一种可视化编程工具。在这个“VB做的一个排序算法”项目中,我们可以期待学习到如何在VB环境中实现各种...
在文档的最后,提到了几个专题,例如《JavaScript排序算法总结》、《JavaScript数据结构与算法技巧总结》等,这些专题可以帮助开发者更加深入地了解JavaScript编程,特别是在排序算法和数据结构方面。这些专题通常...
在升序排序中,如果需要降序排序,只需改变比较条件,使得小于基准的元素与大于基准的元素交换位置即可。 快速排序的平均时间复杂度为O(n log n),最坏情况下(输入数组已经排序或逆序)时间复杂度为O(n^2)。不过...
2.可以支持升序、降序、字典排序等多种顺序要求 3.可以随意增加排序算法和顺序要求,保证其他程序不修改 4.减少程序代码中逻辑上的冗余 5.至少用两种方案编程实现该程序包,并说明两个方案的优缺点 6.提交设计报告,...
在易语言编程环境中,"树型框超快排序(支持升序降序及自定义排序)"是一个高级教程,它涉及到数据结构、算法以及用户交互等多个方面。此教程的目的是教给开发者如何利用易语言来实现高效且灵活的排序功能,特别是...