一、简单排序
1.冒泡排序O(n^2)
两两比较,反序交换
public static int[] bubbleSort(int[] arr) { for (int i = 0; i < arr.length - 1; i++) { for (int j = 0; j < arr.length - i - 1; j++) { if (arr[j] > arr[j + 1]) { arr[j] = arr[j] ^ arr[j+1]; arr[j+1] = arr[j] ^ arr[j+1]; arr[j] = arr[j] ^ arr[j+1]; } } } return arr; }
2.选择排序O(n^2)
public static int[] selectSort(int[] arr) { int minIndex = -1; for (int i = 0; i < arr.length - 1; i++) { minIndex = i; for (int j = i + 1; j < arr.length; j++) { if(arr[minIndex] > arr[j]) { minIndex = j; } } if(i != minIndex) { arr[i] = arr[minIndex] ^ arr[i]; arr[minIndex] = arr[minIndex] ^ arr[i]; arr[i] = arr[minIndex] ^ arr[i]; } } return arr; }
3.插入排序
将一个记录插入到已经排好序的有序表中得到一个新的、记录增1的有序表
public static int[] insertSort(int[] arr) { int sentinel; int index = -1; for (int i = 1; i < arr.length; i++) { sentinel = arr[i]; if(arr[i] < arr[i - 1]) { // loop compare for (int j = 0; j < i; j++) { if(arr[i] < arr[j]) { index = j; break; } } // move for (int k = i; k > index; k--) { arr[k] = arr[k] ^ arr[k-1]; arr[k-1] = arr[k] ^ arr[k-1]; arr[k] = arr[k] ^ arr[k-1]; } arr[index] = sentinel; } } return arr; }
二、复杂排序
1.希尔排序O(n^(3/2))
增量序列最后一个增量值必须等于1,初次取序列的一半为增量,以后每次减半,使序列基本有序,直到增量为1。
不实现了,在直接排序的基础上增加了一个增量,序列的增量比较。
2.堆排序O(nlogn)
是在选择排序基础上的改进,将序列构建成一个大顶堆,将堆顶元素移走,再将剩下的元素重新构建一个堆
堆:完全二叉树,节点大于或等于其左右节点的值称为大顶堆,小于或等于称为小顶堆
public static int[] heapSort(int[] arr) { int len = arr.length; // 构建大顶堆 for (int i = len / 2; i > 0 ; i--) { adjustHeap(arr, i-1, len); } for (int i = len - 1; i > 0; i--) { // 将堆顶数据与最后一个数据交换 arr[0] = arr[0] ^ arr[i]; arr[i] = arr[0] ^ arr[i]; arr[0] = arr[0] ^ arr[i]; adjustHeap(arr, 0, i); } return arr; } // 调整堆结构 public static int[] adjustHeap(int[] arr, int curInd, int len) { int tmp = arr[curInd]; // 当前节点与其自节点比较交换 子节点:2*curIndex 2*curIndex+1 for(int i = (curInd + 1) * 2; i <= len; i++) { // 判断左右节点大小,将i设置为较大值index if (i < len && arr[i-1] < arr[i]) { ++i; } // 父节点与较大子节点比较 if (arr[curInd] > arr[i-1]) { break; } arr[curInd] = arr[curInd] ^ arr[i-1]; arr[i - 1] = arr[curInd] ^ arr[i-1]; arr[curInd] = arr[curInd] ^ arr[i-1]; curInd = i - 1; } arr[curInd] = tmp; return arr; }
3.归并排序
用递归和分而治之的技术将数据序列划分成为越来越小的半子表,再对半子表排序,最后再用递归步骤将排好序的半子表合并成为越来越大的有序序列
public static int[] mergeSort(int[] arr, int first, int last) { if ((first + 1) < last) { int mid = (first + last) / 2; mergeSort(arr, first, mid); mergeSort(arr, mid, last); merge(arr, first, mid, last); } return arr; } public static void merge(int[] arr, int first, int mid, int last) { int[] tmp = new int[last - first]; int indexL = first, indexR = mid, index = 0; while(indexL < mid && indexR < last) { if (arr[indexL] < arr[indexR]) { tmp[index] = arr[indexL]; indexL ++; } else { tmp[index] = arr[indexR]; indexR ++; } index ++; } while (indexL < mid) { tmp[index] = arr[indexL]; index ++; indexL ++; } while (indexR < last) { tmp[index] = arr[indexR]; index ++; indexR ++; } index = 0; for (int i = first; i < last; i++) { arr[i] = tmp[index]; index ++; } }
4.快速排序O(nlogn)
经过一次排序分割成2部分,一部分大于另一部分
public static int[] quickSort(int[] arr, int low, int high) { int privot; if (low < high) { privot = partition(arr, low, high); quickSort(arr, low, privot - 1); quickSort(arr, privot + 1, high); } return arr; } public static int partition(int[] arr, int low, int high) { int privotKey = arr[low]; while (low < high) { while (low < high && privotKey <= arr[high]) { high--; } swap(arr, low, high); while (low < high && privotKey >= arr[low]) { low++; } swap(arr, low, high); } return low; } public static void swap(int[] arr, int i1, int i2) { if (i1 != i2) { arr[i1] = arr[i1] ^ arr[i2]; arr[i2] = arr[i1] ^ arr[i2]; arr[i1] = arr[i1] ^ arr[i2]; } }
优化:随机选取、三数取中
相关推荐
在数据结构和算法领域中,存在大量不同的概念和术语,这些都构成了计算机科学的基础。思维导图是一种有效的方式来组织和回顾这些概念,通过可视化方式帮助记忆和理解。从提供的文件【标题】:"数据结构和算法-思维...
数据结构与算法是计算机科学中的核心课程,它探讨如何有效地组织和处理数据,以及如何设计和分析解决问题的算法。这份“数据结构与算法-PPT课件”提供了丰富的学习材料,涵盖了多个关键主题。 首先,我们要了解数据...
《Java数据结构和算法-带书签目录扫描版》是一本深入探讨Java编程语言中数据结构和算法的书籍。此扫描版特别包含了完整的书签目录,使得读者在电子版阅读时能够快速定位到所需章节,提高了学习和查阅的效率。 在...
数据结构与算法是计算机科学的基础,对于理解和解决复杂问题至关重要。这份"数据结构与算法 -电子教案"无疑是学生们深入学习这一领域的宝贵资源。以下是对其中可能包含的知识点的详细阐述: 1. **数据结构**: 数据...
数据结构与算法是计算机科学的基础,对于理解和设计高效的软件至关重要。在Java编程中,理解这些概念可以帮助开发者编写出性能优异的程序。以下是基于标题“数据结构与算法-java”及描述中提到的“数据结构与算法...
数据结构和算法是计算机科学的基础,对于理解和设计高效的软件至关重要。本资源——“数据结构和算法-Flash动画演示”提供了一种生动形象的方式来学习这些核心概念。通过Flash动画,你可以直观地看到各种算法的动态...
排序算法则是数据结构中的重要部分,它们用于对一组数据进行有序排列。在这个实验中,我们将关注六种不同的排序算法:选择排序、冒泡排序、插入排序、基数排序以及快速排序和归并排序。下面是对这些排序算法的详细...
数据结构与算法是计算机科学的基础,对于任何编程语言来说,理解和掌握它们都是至关重要的,特别是对于Java语言。在这个“数据结构与算法--Java语言描述”的资料中,我们有望深入理解这些核心概念,并通过Java语言来...
这个压缩包文件"算法-数据结构和算法-1-算法的引入和算法时间复杂度.rar"主要探讨了这两个概念的入门知识,特别是关注算法的时间复杂度分析。 首先,我们需要理解什么是算法。算法是一系列明确的步骤或指令,用于...
本书《Hello 算法》是为了帮助读者学习数据结构与算法而编写的,作者靳宇栋(Krahets)认为刷题虽然是学习算法的一种方法,但对于基础不足的同学来说,可能会感到困扰和挫折。因此,本书旨在引导读者探索数据结构与...
数据结构与算法是计算机科学的基础,对于理解和设计高效的软件至关重要。C语言因其高效、底层特性,常被用于实现数据结构和算法。本资料包“数据结构与算法-C语言版本”聚焦于通过源码实例和答案解析,帮助学习者...
"西安电子科技大学-数据结构与算法-期末知识点...本资源涵盖了数据结构与算法的基本概念、线性表、栈与队列、树与二叉树、图、查找算法和排序算法等方面的知识点,对于学习数据结构与算法的学生具有重要的参考价值。
在IT领域,排序算法是数据结构与算法中的基础部分,对于高效处理大量数据至关重要。本文主要探讨了排序算法中的几种经典方法,包括直接插入排序、折半插入排序以及希尔排序。 首先,排序定义是为了将一个数据序列...
数据结构与算法-单链表的排序
在压缩包文件中,我们可能找到书中提到的各种数据结构和算法的源代码实现,如链表、栈、队列、树、图、排序算法和查找算法等。 1. **链表**:链表是数据结构的基础,包括单链表、双链表和循环链表。在C++中,链表...
本书旨在帮助读者理解并掌握如何在Java编程环境中有效地设计和实现数据结构及算法,从而提升程序的性能和效率。 首先,数据结构是计算机科学中的核心概念,它涉及到如何组织和存储数据,以便高效地访问和操作。书中...
在计算机科学领域中,排序算法是一种基本的算法,它可以将数据按照一定的顺序排列,以便更好地存储、检索和处理数据。排序算法的速度和效率对程序的性能有着至关重要的影响。 1.冒泡排序算法 冒泡排序算法是一种...
数据结构课程设计,C语言,七大排序算法比较
以上是数据结构中关于排序的一些基本知识,包括排序的稳定性、比较次数、内部排序和外部排序的定义,以及直接插入排序、折半插入排序、希尔排序和冒泡排序的原理和特点。这些排序算法各有优缺点,选择哪种排序算法取...