排序算法
-------1. 插入排序
-----------直接插入排序
-----------希尔插入排序
-------2. 交换排序
-----------冒泡排序
-----------快速排序
-------3. 选择排序
-----------直接选择排序
-----------堆排序
-------4. 归并排序
-------5. 基数数排序
一般企业会让你说出几种排序算法,而且要求你用一种排序算法给一个数组排序,查看你的变成和代码编写的熟练程度。
下面我将给大家介绍四种常见而且常考的排序算法:
1. 直接插入排序
------算法思想:------------------------
2.要处理的数据A和前面的数据依次比较(从前向后),如果该数据比前面数据小,
* 将该点作为插入点,备份数据A,
* 将插入点之后处理数据A之前的数据整体向后移动覆盖A的位置,
* 然后将备份数据插入到插入点的位置
3.取下一个待处理数据,执行步骤2
4.循环步骤3直到,需要处理的数据为0
------代码实现:------------------------
public void straightInsertionSort(double[] sorted){
//获取待排序数组的长度
int sortedLen = sorted.length;
//从第二个数据开始处理,下标为1
for(int i=1;i<sortedLen;i++){
//j表示待处理数据前面的数据的下标,j的首位置为0
for(int j=0;j<=i-1;j++){
//如果发现处理数据比前面的数据小,则将,此时的 j 作为插入点
// i 为处理元素位置
//如果想要从大到小排序只需要将if语句中的<变成>即可
if(sorted[i]<sorted[j]){
//备份处理元素
double back = sorted[i];
//将插入点之后的元素依次向后移动覆盖处理元素位置
for(int k=i;k>j;k--){
sorted[k]=sorted[k-1];
}
//将处理元素插入到插入点位置
sorted[j]=back;
//第一趟排序完成退出内层循环
break;
}
}
}
}
--2. 冒泡排序
冒泡排序对部分以排序的数据进行排序操作,速度可以很快,但是对于一点顺序都没有的数据,排序效率将会非常差。
------算法思想:--------------------
冒泡排序即可以从前向后扫描也可以从后向前扫描,这里以从后向前
扫描为例。
从后向前扫描数据清单,将出现乱序的相邻的两个数据交换位置,继续向前扫描。
这样如果是从大到小的冒泡排序排序,扫描一遍之后,最大的数据将出现在数据清单的首位,
再扫描一遍第二大的数据将出现在第二号位置,一直重复扫描操作,直到全部数据有序
------代码实现:------------------------
public void bubbleSort(double[] sorted){
//获取数据的长度
int sortedLen=sorted.length;
// i 代表扫描次数
for(int i=1;i<=sortedLen;i++){
//定义一个有序标志
boolean flag=true;
//从后向前扫描,所以 j 的其实位置为sortedLen-1
//每扫描一次将出现一个最大元素排在前面并有序,所一下一次扫描的长度将减少一个
//即扫描的结束位置的下标为 i-1
for(int j=sortedLen-1;j>i-1;j--){
//如果发现后面元素比相邻的前面的元素大,就交换位置
if(sorted[j]>sorted[j-1]){
sorted[j] = sorted[j]+sorted[j-1];
sorted[j-1] = sorted[j]-sorted[j-1];
sorted[j] = sorted[j] - sorted[j-1];
//如果有数据交换说明,排序数据不是有序的
flag= false;
}
}
//如果标志没有改变,说明排序数据是有序的,无需排序了,直接退出
if(flag){
return;
}
}
}
--3. 快速排序:
------算法思想-------------
快速排序也为交换排序的一种,它的算法思想是
1. 在排序数据中选择一个值指定为pivotKey,将大于pivotKey的数据方到右边,
将小于pivotKey的数据放到左边,
2. 取pivotKey左边的数据递归执行1,取pivotKey右边的数据递归执行1
------代码实现:------------------------
public void quickSort(double[] sorted,int low,int high){
//low和high相等说明,此时待排序数据为一个元素,无需排序
if(low<high){
//每调用一次getMiddle()方法就进行一次快速排序
//中间值middle为pivotKey所在的位置的下标,他的左边为
//小于它的数,右边为大于他的数
int middle = getMiddle(sorted,low,high);
//对左边的数进行相同规则的递归算法
quickSort(sorted,low,middle-1);
//对右边的数进行相同规则的递归算法
quickSort(sorted,middle+1,high);
}
}
/**
* 作一趟快速排序让左边的数都小于指定值pivotKey,右边的数都大于指定值
* low指示待排序数据的起使下标,high指示待排序数据的的结束下标
* @param sorted
* @param low
* @param high
* @return
*/
private int getMiddle(double[] sorted, int low, int high) {
//将排序数据的第一个值作为中心值
double pivotKey=sorted[low];
//首先判断low<high说明可以进行排序操作
while(low<high){
//如果low小于high且高值大于中心值,说明不需要交换,high--
//如果一路顺利的执行下去,low并将等于high跳出循环,如果发现有一个值
//小于中心值,将跳出循环,将高值赋值到中心值的位置,
//当前high指向位置将成为无用信息
while(low<high && sorted[high]>=pivotKey){
high--;
}
sorted[low]=sorted[high];
//低值发现,自己比中心值大,将赋值到高值无用信息的位置上
//然而此时当前low指向的位置上的数据将成为无用信息
while(low<high && sorted[low]<=pivotKey){
low++;
}
sorted[high]=sorted[low];
//循环以上步骤,直到low等于high
}
//low等于high时,跳出循环,此时low和high共同指向的位置为,中心值的位置
sorted[low]=pivotKey;
return low;
}
--选择排序:
-------算法思想:-----------
第 i 次选取 i 到array.length-1中间最小的值放在 i 的位置
------代码实现:------------------------
public void straightSelectSort(double[] sorted){
int sortedLen=sorted.length;
// i 为比较的次数, 长度为sortedLen的数据需要比较sortedLen-1次
for(int i=0;i<sortedLen-1;i++){
//记录最小值的位置
int pointer = 0;
//临时变量用于和其他数据比较寻找最小值
double temp = sorted[i];
//第 i 次比较时,i 处的元素要和 i 之后的所有元素比较,所以j的初值为i+1
for(int j=i+1;j<sortedLen;j++){
if(temp>sorted[j]){
temp=sorted[j];
pointer=j;
}
}
//交换数据
sorted[pointer]=sorted[i];
sorted[i] = temp;
}
}
以上四种算法是我们必须掌握的,大多数企业特别的喜欢考,希望大家好好学习,也不要浪费了我这么长时间的辛苦总结,希望大家都能找到一份称心的工作!
相关推荐
在本系统中,我们主要实现了五种常用的排序算法:冒泡排序法、快速排序法、直接插入排序法、折半插入排序法和树形选择排序法。这些算法都是在计算机科学中最基本和最重要的排序算法,广泛应用于各种数据处理和分析...
常见的经典排序算法有希尔排序、二分插入法、直接插入法、带哨兵的直接排序法、冒泡排序、选择排序、快速排序、堆排序等。 一、希尔排序(Shell 排序法) 希尔排序法,又称宿小增量排序,是 1959 年由 D.L.Shell ...
常见的排序算法有插入排序、快速排序、选择堆积排序法等。 插入排序算法是一种简单的排序算法,适用于小规模的数据结构。该算法将数据结构分成已排序部分和未排序部分,并将未排序部分的元素插入到已排序部分中。...
在计算机科学领域,排序算法是数据处理中的核心部分,它涉及到如何有效地重新排列一组数据,使其按照特定的顺序排列。本资源"总结了各种排序算法,并用C++代码实现,并有演示",提供了丰富的学习材料,包括不同类型...
希尔排序是一种基于插入排序的算法,通过将待排序的数组元素按某个增量分组,然后对每组使用直接插入排序算法排序。随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止...
本篇文章将介绍一种经典的排序算法——**合并排序法**(Merge Sort),并通过C语言实现该算法。合并排序是一种非常有效的排序方法,其核心思想是分治法:将数据分为若干个子集,对这些子集分别进行排序,最后将排序...
最快的排序算法 最快的内部排序法—桶排序法,排序算法数据结构
在IT领域,排序算法是计算机科学中的基础但至关重要的概念,尤其在数据处理和算法设计中扮演着核心角色。本文将深入探讨标题中提到的几种基于比较的排序算法:选择排序、插入排序、归并排序、快速排序、堆排序、冒泡...
最快的排序算法 最快的内部排序法—桶排序法 (1),排序算法数据结构
在计算机科学领域中,排序算法是一种基本的算法,它可以将数据按照一定的顺序排列,以便更好地存储、检索和处理数据。排序算法的速度和效率对程序的性能有着至关重要的影响。 1.冒泡排序算法 冒泡排序算法是一种...
该程序包含7大排序算法: # sort.bubbleSort() #冒泡排序 # sort.shellSort() #希尔排序 # sort.insertionSort() #插入排序 # sort.Selectionsort1() #选择排序 # sort.heapSort() #堆排序 # sort.countSort() ...
根据给定文件的信息,本文将深入探讨C语言中的两种经典排序方法:插入排序法与冒泡排序法。这两种方法在实际编程中应用广泛,对于理解数据结构与算法的基础概念至关重要。 ### 一、冒泡排序法 #### 1.1 基本原理 ...
双向起泡排序法是一种在链表结构中实现的排序算法,尤其适用于双向链表。它借鉴了传统冒泡排序的基本思想,但在链表环境中进行了优化,以提高效率。本篇文章将详细探讨双向起泡排序法及其在带头结点的双向链表中的...
六种排序算法的排序系统 本篇文章主要讲解了六种排序算法的排序系统,包括插入排序、冒泡排序、选择排序、快速排序、堆排序和归并排序。该系统可以让用户选择六种排序算法中的任意一个,并输出结果。 插入排序 ...
在IT领域,排序算法是计算机科学中的基础但至关重要的部分,尤其在数据处理和数据分析中起着关键作用。本文将详细探讨标题所提及的几种排序算法:合并排序、插入排序、希尔排序、快速排序、冒泡排序以及桶排序,并...
在计算机科学中,排序算法是数据结构领域的重要组成部分,它涉及到如何有效地重新排列一组数据,使其按照特定的顺序排列。本资源提供了三种经典的排序算法的C语言实现:堆排序、直接插入排序和快速排序。 首先,让...
在计算机科学领域,排序算法是数据处理中至关重要的一部分,它涉及到如何有效地重新排列一组数据,使其按照特定的顺序排列。本资源提供了七大经典排序算法的实现程序,包括快速排序、冒泡排序、选择排序、归并排序、...
时间复杂度用于衡量排序算法的效率,通常以大O表示法来表示。文档中提到了几种不同排序算法的时间复杂度: - **O(n²)**:插入排序、冒泡排序和选择排序的时间复杂度均为O(n²),这意味着随着数据量的增加,这些...
排序算法是计算机科学中最基础和重要的算法之一,用于将一组数据按照特定的顺序进行排列。本文将对几种常见的内部排序算法和外部排序算法进行详细总结。 首先,排序的基本定义是:给定一个包含n个记录的序列,其...
在编程领域,排序算法是计算机科学中的重要组成部分,特别是在数据处理和算法效率分析上。本文将详细介绍C++中实现的希尔排序、快速排序、堆排序和归并排序这四种经典排序算法。 希尔排序,由Donald Shell于1959年...