一、选择排序(selectionSort)
基本思想:
每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
二、冒泡排序(bubbleSort)
基本思想:
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
- 冒泡和选择很相似,每一轮比较都是找出最值,不同的是找最值的方式不同
三、插入排序(insertSort)
基本思想:
始终保证前面的数是有序的,然后将后面一个数 x 取出,依次向前比较,直到大于等于前面某个数,或者到头了,那么这时的位置就是x应该放的位置,再重复操作
四、快速排序(quickSort)
快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法
分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。
快速排序的基本思想:
设当前待排序的无序区为R[left..right],利用分治法可将快速排序的基本思想描述为:
a,分解
- 在R[left..right]中任选一个记录作为基准(Pivot),
- 以此基准将当前无序区划分为左、右两个较小的子区间R[left..pivotpos-1)和R[pivotpos+1..right],
- 并使左边子区间中所有记录的关键字均小于等于基准记录pivot
- 右边的子区间中所有记录的关键字均大于等于pivot
- 而基准记录pivot则位于正确的位置(pivotpos)上,它无须参加后续的排序
- 划分的关键是要求出基准记录所在的位置pivotpos。划分的结果可以简单地表示为(pivot=R[pivotpos])
b,求解
通过递归调用快速排序对左、右子区间R[left..pivotpos-1]和R[pivotpos+1..right]快速排序。
c,组合
因为当"求解"步骤中的两个递归调用结束时,其左、右两个子区间已有序。对快速排序而言,"组合"步骤无须做什么,可看作是空操作
以下是具体代码:
class SortDemo { public static void main(String[] args) { int[] arr = new int[]{5,3,6,8,4,6,9,2}; //选择排序 //selectionSort(arr); //冒泡排序 //bubbleSort(arr); //插入排序 //insertSort(arr); //快速排序 quickSort(arr,0,arr.length-1); for(int x=0;x<arr.length-1;x++) { System.out.print(arr[x]+","); } System.out.println(arr[arr.length-1]); } //选择排序 public static void selectionSort(int[] arr) { for(int x=0;x<arr.length-1;x++) { for(int y=x+1;y<arr.length;y++) { if(arr[x]>arr[y]) { swap(arr,x,y); } } } } //冒泡排序 public static void bubbleSort(int[] arr) { for(int x=0;x<arr.length-1;x++)//只需要比较arr.length-2次 { //-x是因为每次比较后最后一个都是最值,不用再比较了 -1是为了防止角标越界 for(int y=0;y<arr.length-x-1;y++) { if(arr[y]>arr[y+1]) { swap(arr,y,y+1); } } } } //插入排序 public static void insertSort(int[] arr) { //从1开始,因为为0时只有一个数,无需比较 for(int x=1;x<arr.length;x++) { //用temp记录要插入的数,相当于留一个空位 int temp = arr[x]; //x-1是有序数据的最大角标,插入就在有序的数据中插入 int y = x-1; for(;y>=0 && arr[y]>temp;y--) { //如果y>=0,并且arr[y]大于temp就把arr[y]向后移一位 arr[y+1] = arr[y]; } //比较完成后y+1就是temp该放的位置 arr[y+1] = temp; } } //快速排序 public static void quickSort(int[] arr,int left,int right) { //对arr[left,right]快速排序 int pivotpos;//划分后的基准的记录位置 //仅当区间长度大于1时才排序 if(left < right) { //对arr[left,right]做划分 pivotpos = partition(arr,left,right); quickSort(arr,left,pivotpos-1);//对左区间递归排序 quickSort(arr,pivotpos+1,right);//对右区间递归排序 } } //取得基准位置,划分区域 private static int partition(int[] arr,int left,int right) { //取区间最左边的数最为基准数 int pivot = arr[left]; int pivotpos;//记录pivot所在的位置 int x = left; int y = right; while(x < y) { //先从右边开始找第一个小于pivot的数,要保证 x<y //因为比如说第一个数是最小的,那么没有x<y那么y--最后就会等于-1 while(arr[y] >= pivot && x < y) y--; //x = y的时候不用交换 if(x < y) swap(arr,x,y); //再从左边开始找第一个大于pivot的数,要保证 x<y while(arr[x] <= pivot && x < y) x++; if(x < y) swap(arr,x,y); } //一轮比较后x的值就是pivotpos也就是pivot所在的位置 pivotpos = x; return pivotpos; } //交换数组中两个数的位置 public static void swap(int[] arr,int x,int y) { int temp = arr[x]; arr[x] = arr[y]; arr[y] = temp; } }
五、Arrays.sort(arr);//java中已经定义好的一种排序方式,开发中,对数组排序,要使用该句代码
相关推荐
这是一款mp3排序软件,可以随心所欲的调整MP3机内歌曲的播放顺序,使大家欣赏音乐时更加舒适。新版本改变了界面,重新设计了算法,整理速度超快,增加了各种排序方式,方便实用。附带了其他mp3工具(*Mp3(闪存)无法拔...
MP3排序软件MP3排序软件MP3排序软件MP3排序软件MP3排序软件MP3排序软件MP3排序软件MP3排序软件
U盘内MP3,音乐等播放时乱了,此排序软件可以很好地解决这种问题
演算法课程AlgorithmsCourse3排序Sort.pptx
给定一个数列,用归并排序算法把它排成升序。 输入: 第一行是一个整数n(n不大于10000),表示要排序的数的个数; 下面一行是用空格隔开的n个整数。 输出: 输出排序后的数列,每个数字占一行。 输入样例: ...
导入jar 包 调用 String[] arr1 = new String[1]; ... 参数1 排序的集合 参数2 排序的字段(与定义字段一致) 可多个 参数3 排序方式(asc desc) 暂时只支持String 和int的排序 可能有些BUG 敬请谅解
个人总结十大排序算法的Python 3 实现,实测可运行。具体包括:-1 插排-2 希尔-3 选择-4 快排-5 冒泡-6 堆排-7 归并-8 计数-9 桶排-10 基数
3 排序算法的好坏如何衡量 时间效率 排序速度(即排序所经历的全部比较次数) 空间效率 占内存辅助空间的大小 稳定性 若两个记录A和B的关键字值相等 排序后A B的先后次序保持不变 则称这种排序算法是稳定的 ">3 ...
(1) 完成5种常用内部排序算法的演示,5种排序算法为:快速排序,...(3) 演示程序开始,以菜单形式让用户选择数据的生成方式和不同的排序方法演示; (4) 排序算法演示要求输出排序花费的时间以便进行定量比较;
在本实验3中,我们将深入理解并实现冒泡排序程序。 冒泡排序的核心在于其迭代过程。每次迭代会遍历整个序列,对比每对相邻元素,如果它们的顺序错误(即前一个元素大于后一个元素),就交换它们的位置。这个过程会...
实现以下常用的内部排序算法并进行性能比较:"直接插入排序"," 折半插入排序"," 2—路插入排序"," 表插入排序"," 希尔排序"," 起泡排序"," 快速排序"," 简单选择排序"," 树形选择排序"," 堆排序"," 归并排序"," 链式...
3. **冒泡排序**: 冒泡排序是一种直观的排序算法,通过不断交换相邻的逆序元素来逐渐排序整个数组。在每一轮迭代中,最大的元素都会“冒泡”到数组的末尾。这个过程会重复进行,直到数组完全排序。冒泡排序的时间...
3. **希尔排序(Shell Sort)**: 希尔排序是插入排序的一种优化版本,通过将待排序的元素按某个增量分组,然后对每组进行插入排序,逐渐减少增量,直到增量为1,完成排序。希尔排序的时间复杂度在最坏情况下为O(n^...
3. **插入排序**:简单直观,对于小规模数据或部分有序的数据效率较高。它的工作原理类似于我们平时手动整理扑克牌,每次取一个未排序的元素,插入到已排序的部分中合适的位置,直到所有元素都插入完毕。 4. **选择...
3. **快速排序**:由C.A.R. Hoare提出的分治策略,选取一个基准值,将数组分为小于基准值和大于基准值的两部分,然后递归地对这两部分进行快速排序。C#实现中,关键在于划分操作。快速排序平均时间复杂度为O(n log n...
3. **插入排序**:插入排序是将一个记录插入到已经排序好的有序表中,从而得到一个新的、记录数加一的有序表。源码实现中,通常采用两层循环,外层控制元素个数,内层通过移动元素找到合适的位置插入新元素。 4. **...
3. 选择排序:每次从未排序的部分中找出最小(或最大)的元素,放到已排序部分的末尾。经过n-1次这样的操作,整个数组就被排序了。选择排序不保证每一步都是最优的,但其交换次数较少。 4. 归并排序:同样基于分治...
3. **桶排序**:桶排序假设输入数据均匀且独立地分布在一个范围内,它将数据分到若干个“桶”中,每个桶内部再单独排序,最后依次遍历每个桶内的数据,将所有桶中的数据合并成有序序列。桶排序在数据分布均匀时效率...
3. **堆排序**: 堆排序是一种基于比较的排序算法,利用了二叉堆的性质。首先,将待排序数组构建成一个大顶堆或小顶堆,然后将堆顶元素与末尾元素交换,调整剩余元素为新的堆,重复此过程。C++实现时,可以使用标准...
3. **快速排序**:快速排序由C.A.R. Hoare提出,是目前最常用的排序算法之一。它的基本思想是采用分治策略,选取一个基准元素,通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的...