文档库 最新最全的文档下载
当前位置:文档库 › 常用的各种排序算法的JAVA实现222

常用的各种排序算法的JAVA实现222

常用的各种排序算法的JAVA实现222
常用的各种排序算法的JAVA实现222

文章由https://www.wendangku.net/doc/eb4656266.html,@资料分享平台

用JAVA把《Data Structure and Algoritm Analysis in C》里面的排序算法实现了。现在贴出来希望有人能帮我指正一下里面的错误。

整个结构我使用的是Strategy模式,这是一种很显然的选择。由Sort类扮演环境角色,SortStrategy 扮演抽象策略角色。具体策略角色有六个,分别是InsertSort、BubbleSort、ChooseSort、ShellSort、MergeSort、QuickSort。分别是插入排序、冒泡排序、选择排序、希尔排序、归并排序和快速排序。还有堆排序、双向冒泡排序等我还没有写,写好了再贴上来。

因为代码量比较大,所以我分为几次贴出,这次只贴出Sort和SortStrategy的代码。

SortStratey接口:

package Utils.Sort;

/**

*排序算法的接口

*/

interface SortStrategy

{

/**

*利用各种算法对实现了Comparable接口的数组进行升序排列

*/

public void sort(Comparable[] obj);

}

Sort类:

package Utils.Sort;

/**

*排序类,通过此类的sort()可以对实现了Comparable接口的数组进行升序排序

*/

public class Sort

{

private SortStrategy strategy;

/**

*构造方法,由type决定由什么算法进行排序,排序方法的单词守字母要大字,如对于快速排序应该是uickSort

*@param type 排序算法的类型

*/

public Sort(String type)

{

try

{

type = "Utils.Sort." + type.trim();

Class c = Class.forName(type);

strategy = (SortStrategy)c.newInstance();

}

catch (Exception e)

{

e.printStackTrace();

}

}

/**

*排序方法,要求待排序的数组必须实现Comparable接口

*/

public void sort(Comparable[] obj)

{

strategy.sort(obj);

}

}

************************************************************************************************ package Utils.Sort;

/**

*插入排序,要求待排序的数组必须实现Comparable接口

*/

public class InsertSort implements SortStrategy

{

/**

*利用插入排序算法对obj进行排序

*/

public void sort(Comparable []obj)

{

if (obj == null)

{

throw new NullPointerException("The argument can not be null!");

}

/*

*对数组中的第i个元素,认为它前面的i - 1个已经排序好,然后将它插入到前面的i - 1个元素中

*/

int size = 1;

while (size < obj.length)

{

insert(obj, size++, obj[size - 1]);

}

}

/**

*在已经排序好的数组中插入一个元素,使插入后的数组仍然有序

*@param obj 已经排序好的数组

*@param size 已经排序好的数组的大小

*@param c 待插入的元素

*/

private void insert(Comparable []obj, int size, Comparable c)

{

for (int i = 0 ;i < size ;i++ )

{

if (https://www.wendangku.net/doc/eb4656266.html,pareTo(obj[i]) < 0)

{

System.out.println(obj[i]);

//如果待插入的元素小于当前元素,则把当前元素后面的元素依次后移一位

for (int j = size ;j > i ;j-- )

{

obj[j] = obj[j - 1];

}

obj[i] = c;

break;

}

}

}

}

*************************************************************************************** package Utils.Sort;

/**

*@author Linyco

*利用冒泡排序法对数组排序,数组中元素必须实现了Comparable接口。

*/

public class BubbleSort implements SortStrategy

{

/**

*对数组obj中的元素以冒泡排序算法进行排序

*/

public void sort(Comparable[] obj)

{

if (obj == null)

{

throw new NullPointerException("The argument can not be null!");

}

Comparable tmp;

for (int i = 0 ;i < obj.length ;i++ )

{

//切记,每次都要从第一个开始比。最后的不用再比。

for (int j = 0 ;j < obj.length - i - 1 ;j++ )

{

//对邻接的元素进行比较,如果后面的小,就交换

if (obj[j].compareTo(obj[j + 1]) > 0)

{

tmp = obj[j];

obj[j] = obj[j + 1];

obj[j + 1] = tmp;

}

}

}

}

}

****************************************************************************************** package Utils.Sort;

/**

*@author Linyco

*利用选择排序法对数组排序,数组中元素必须实现了Comparable接口。

*/

public class ChooseSort implements SortStrategy

{

/**

*对数组obj中的元素以选择排序算法进行排序

*/

public void sort(Comparable[] obj)

{

if (obj == null)

{

throw new NullPointerException("The argument can not be null!");

}

Comparable tmp = null;

int index = 0;

for (int i = 0 ;i < obj.length - 1 ;i++ )

{

index = i;

tmp = obj[i];

for (int j = i + 1 ;j < obj.length ;j++ )

{

//对邻接的元素进行比较,如果后面的小,就记下它的位置

if (https://www.wendangku.net/doc/eb4656266.html,pareTo(obj[j]) > 0)

{

tmp = obj[j]; //要每次比较都记录下当前小的这个值!

index = j;

}

}

//将最小的元素交换到前面

tmp = obj[i];

obj[i] = obj[index];

obj[index] = tmp;

}

}

}

************************************************************************************************ package Utils.Sort;

/**

*@author Linyco

*利用选择排序法对数组排序,数组中元素必须实现了Comparable接口。

*/

public class ChooseSort implements SortStrategy

{

/**

*对数组obj中的元素以选择排序算法进行排序

*/

public void sort(Comparable[] obj)

{

if (obj == null)

{

throw new NullPointerException("The argument can not be null!");

}

Comparable tmp = null;

int index = 0;

for (int i = 0 ;i < obj.length - 1 ;i++ )

{

index = i;

tmp = obj[i];

for (int j = i + 1 ;j < obj.length ;j++ )

{

//对邻接的元素进行比较,如果后面的小,就记下它的位置

if (https://www.wendangku.net/doc/eb4656266.html,pareTo(obj[j]) > 0)

{

tmp = obj[j]; //要每次比较都记录下当前小的这个值!

index = j;

}

}

//将最小的元素交换到前面

tmp = obj[i];

obj[i] = obj[index];

obj[index] = tmp;

}

}

}

************************************************************************************************ package Utils.Sort;

/**

*归并排序,要求待排序的数组必须实现Comparable接口

*/

public class MergeSort implements SortStrategy

{

private Comparable[] bridge;

/**

*利用归并排序算法对数组obj进行排序

*/

public void sort(Comparable[] obj)

{

if (obj == null)

{

throw new NullPointerException("The param can not be null!");

}

bridge = new Comparable[obj.length]; //初始化中间数组

mergeSort(obj, 0, obj.length - 1); //归并排序

bridge = null;

}

/**

*将下标从left到right的数组进行归并排序

*@param obj要排序的数组的句柄

*@param left 要排序的数组的第一个元素下标

*@param right 要排序的数组的最后一个元素的下标

*/

private void mergeSort(Comparable[] obj, int left, int right)

{

if (left < right)

{

int center = (left + right)/2;

mergeSort(obj, left, center);

mergeSort(obj, center + 1, right);

merge(obj, left, center, right);

}

}

/**

*将两个对象数组进行归并,并使归并后为升序。归并前两个数组分别有序*@param obj 对象数组的句柄

*@param left 左数组的第一个元素的下标

*@param center 左数组的最后一个元素的下标

*@param right 右数组的最后一个元素的下标

*/

private void merge(Comparable[] obj, int left, int center, int right)

{

int mid = center + 1;

int third = left;

int tmp = left;

while (left <= center && mid <= right)

{

//从两个数组中取出小的放入中间数组

if (obj[left].compareTo(obj[mid]) <= 0)

{

bridge[third++] = obj[left++];

}

else

bridge[third++] = obj[mid++];

}

//剩余部分依次置入中间数组

while (mid <= right)

{

bridge[third++] = obj[mid++];

}

while (left <= center)

{

bridge[third++] = obj[left++];

}

//将中间数组的内容拷贝回原数组

copy(obj, tmp, right);

}

/**

*将中间数组bridge中的内容拷贝到原数组中

*@param obj 原数组的句柄

*@param left 要拷贝的第一个元素的下标

*@param right 要拷贝的最后一个元素的下标

*/

private void copy(Comparable[] obj, int left, int right)

{

while (left <= right)

{

obj[left] = bridge[left];

left++;

}

}

}

*********************************************************************************************** package Utils.Sort;

/**

*希尔排序,要求待排序的数组必须实现Comparable接口

*/

public class ShellSort implements SortStrategy

{

private int[] increment;

/**

*利用希尔排序算法对数组obj进行排序

*/

public void sort(Comparable[] obj)

{

if (obj == null)

{

throw new NullPointerException("The argument can not be null!");

}

//初始化步长

initGap(obj);

//步长依次变化(递减)

for (int i = increment.length - 1 ;i >= 0 ;i-- )

{

int step = increment[i];

//由步长位置开始

for (int j = step ;j < obj.length ;j++ )

{

Comparable tmp;

//如果后面的小于前面的(相隔step),则与前面的交换

for (int m = j ;m >= step ;m = m - step )

{

if (obj[m].compareTo(obj[m - step]) < 0)

{

tmp = obj[m - step];

obj[m - step] = obj[m];

obj[m] = tmp;

}

//因为之前的位置必定已经比较过,所以这里直接退出循环

else

{

break;

}

}

}

}

}

/**

*根据数组的长度确定求增量的公式的最大指数,公式为pow(4, i) - 3 * pow(2, i) + 1和9 * pow(4, i) - 9 * pow(2, i) + 1

*@return int[] 两个公式的最大指数

*@param length 数组的长度

*/

private int[] initExponent(int length)

{

int[] exp = new int[2];

exp[0] = 1;

exp[1] = -1;

int[] gap = new int[2];

gap[0] = gap[1] = 0;

//确定两个公式的最大指数

while (gap[0] < length)

{

exp[0]++;

gap[0] = (int)(Math.pow(4, exp[0]) - 3 * Math.pow(2, exp[0]) + 1);

}

exp[0]--;

while (gap[1] < length)

{

exp[1]++;

gap[1] = (int)(9 * Math.pow(4, exp[1]) - 9 * Math.pow(2, exp[1]) + 1); }

exp[1]--;

return exp;

}

private void initGap(Comparable[] obj)

{

//利用公式初始化增量序列

int exp[] = initExponent(obj.length);

int[] gap = new int[2];

increment = new int[exp[0] + exp[1]];

//将增量数组由大到小赋值

for (int i = exp[0] + exp[1] - 1 ;i >= 0 ;i-- )

{

gap[0] = (int)(Math.pow(4, exp[0]) - 3 * Math.pow(2, exp[0]) + 1); gap[1] = (int)(9 * Math.pow(4, exp[1]) - 9 * Math.pow(2, exp[1]) + 1);

//将大的增量先放入增量数组,这里实际上是一个归并排序

//不需要考虑gap[0] == gap[1]的情况,因为不可能出现相等。

if (gap[0] > gap[1])

{

increment[i] = gap[0];

exp[0]--;

}

else

{

increment[i] = gap[1];

exp[1]--;

}

}

}

}

************************************************************************************************ package Utils.Sort;

/**

*快速排序,要求待排序的数组必须实现Comparable接口

*/

public class QuickSort implements SortStrategy

{

private static final int CUTOFF = 3; //当元素数大于此值时采用快速排序

/**

*利用快速排序算法对数组obj进行排序,要求待排序的数组必须实现了

comparable接口

*/

public void sort(Comparable[] obj)

{

if (obj == null)

{

throw new NullPointerException("The argument can not be null!");

}

quickSort(obj, 0, obj.length - 1);

}

/**

*对数组obj快速排序

*@param obj待排序的数组

*@param left 数组的下界

*@param right 数组的上界

*/

private void quickSort(Comparable[] obj, int left, int right)

{

if (left + CUTOFF > right)

{

SortStrategy ss = new ChooseSort();

ss.sort(obj);

}

else

{

//找出枢轴点,并将它放在数组最后面的位置

pivot(obj, left, right);

int i = left, j = right - 1;

Comparable tmp = null;

{

//将i, j分别移到大于/小于枢纽值的位置

/*因为数组的第一个和倒数第二个元素分别小于和大于枢纽元,所以不会发生数组越界*/

while (obj[++i].compareTo(obj[right - 1]) < 0) {}

while (obj[--j].compareTo(obj[right - 1]) > 0) {}

//交换

if (i < j)

{

tmp = obj[i];

obj[i] = obj[j];

obj[j] = tmp;

}

else

break;

}

//将枢纽值与i指向的值交换

tmp = obj[i];

obj[i] = obj[right - 1];

obj[right - 1] = tmp;

//对枢纽值左侧和右侧数组继续进行快速排序

quickSort(obj, left, i - 1);

quickSort(obj, i + 1, right);

}

}

/**

*在数组obj中选取枢纽元,选取方法为取数组第一个、中间一个、最后一个元素中中间的一个。将枢纽元置于倒数第二个位置,三个中最大的放在数组最后一个位置,最小的放在第一个位置

*@param obj 要选择枢纽元的数组

*@param left 数组的下界

*@param right 数组的上界

*/

private void pivot(Comparable[] obj, int left, int right)

{

int center = (left + right) / 2;

Comparable tmp = null;

if (obj[left].compareTo(obj[center]) > 0)

{

obj[left] = obj[center];

obj[center] = tmp;

}

if (obj[left].compareTo(obj[right]) > 0)

{

tmp = obj[left];

obj[left] = obj[right];

obj[right] = tmp;

}

if (obj[center].compareTo(obj[right]) > 0)

{

tmp = obj[center];

obj[center] = obj[right];

obj[center] = tmp;

}

//将枢纽元置于数组的倒数第二个

tmp = obj[center];

obj[center] = obj[right - 1];

obj[right - 1] = tmp;

}

}

本文链接网址https://www.wendangku.net/doc/eb4656266.html,@资料分享平台

各种排序算法的总结和比较

各种排序算法的总结和比较 1 快速排序(QuickSort) 快速排序是一个就地排序,分而治之,大规模递归的算法。从本质上来说,它是归并排序的就地版本。快速排序可以由下面四步组成。 (1)如果不多于1个数据,直接返回。 (2)一般选择序列最左边的值作为支点数据。(3)将序列分成2部分,一部分都大于支点数据,另外一部分都小于支点数据。 (4)对两边利用递归排序数列。 快速排序比大部分排序算法都要快。尽管我们可以在某些特殊的情况下写出比快速排序快的算法,但是就通常情况而言,没有比它更快的了。快速排序是递归的,对于内存非常有限的机器来说,它不是一个好的选择。 2 归并排序(MergeSort)

归并排序先分解要排序的序列,从1分成2,2分成4,依次分解,当分解到只有1个一组的时候,就可以排序这些分组,然后依次合并回原来的序列中,这样就可以排序所有数据。合并排序比堆排序稍微快一点,但是需要比堆排序多一倍的内存空间,因为它需要一个额外的数组。 3 堆排序(HeapSort) 堆排序适合于数据量非常大的场合(百万数据)。 堆排序不需要大量的递归或者多维的暂存数组。这对于数据量非常巨大的序列是合适的。比如超过数百万条记录,因为快速排序,归并排序都使用递归来设计算法,在数据量非常大的时候,可能会发生堆栈溢出错误。 堆排序会将所有的数据建成一个堆,最大的数据在堆顶,然后将堆顶数据和序列的最后一个数据交换。接下来再次重建堆,交换数据,依次下去,就可以排序所有的数据。

Shell排序通过将数据分成不同的组,先对每一组进行排序,然后再对所有的元素进行一次插入排序,以减少数据交换和移动的次数。平均效率是O(nlogn)。其中分组的合理性会对算法产生重要的影响。现在多用D.E.Knuth的分组方法。 Shell排序比冒泡排序快5倍,比插入排序大致快2倍。Shell排序比起QuickSort,MergeSort,HeapSort慢很多。但是它相对比较简单,它适合于数据量在5000以下并且速度并不是特别重要的场合。它对于数据量较小的数列重复排序是非常好的。 5 插入排序(InsertSort) 插入排序通过把序列中的值插入一个已经排序好的序列中,直到该序列的结束。插入排序是对冒泡排序的改进。它比冒泡排序快2倍。一般不用在数据大于1000的场合下使用插入排序,或者重复排序超过200数据项的序列。

数据结构 各种排序算法

数据结构各种排序算法总结 2009-08-19 11:09 计算机排序与人进行排序的不同:计算机程序不能象人一样通览所有的数据,只能根据计算机的"比较"原理,在同一时间内对两个队员进行比较,这是算法的一种"短视"。 1. 冒泡排序 BubbleSort 最简单的一个 public void bubbleSort() { int out, in; for(out=nElems-1; out>0; out--) // outer loop (backward) for(in=0; in a[in+1] ) // out of order? swap(in, in+1); // swap them } // end bubbleSort() 效率:O(N2) 2. 选择排序 selectSort public void selectionSort() { int out, in, min; for(out=0; out

swap(out, min); // swap them } // end for(out) } // end selectionSort() 效率:O(N2) 3. 插入排序 insertSort 在插入排序中,一组数据在某个时刻实局部有序的,为在冒泡和选择排序中实完全有序的。 public void insertionSort() { int in, out; for(out=1; out0 && a[in-1] >= temp) // until one is smaller, { a[in] = a[in-1]; // shift item to right --in; // go left one position } a[in] = temp; // insert marked item } // end for } // end insertionSort() 效率:比冒泡排序快一倍,比选择排序略快,但也是O(N2) 如果数据基本有序,几乎需要O(N)的时间

java程序员必知的十种程序算法

java程序员必学的十种程序算法 算法1:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。 快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。 算法步骤: 1 从数列中挑出一个元素,称为“基准”(pivot),

2 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。 3 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。 递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。 算法2:堆排序算法

堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。 堆排序的平均时间复杂度为Ο(nlogn) 。 算法步骤: 创建一个堆H[0..n-1] 把堆首(最大值)和堆尾互换 3. 把堆的尺寸缩小1,并调用shift_down(0),目的是把新的数组顶端数据调整到相应位置 4. 重复步骤2,直到堆的尺寸为1 算法3:归并排序 归并排序(Merge sort,台湾译作:合并排序)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 算法步骤:

数据结构-各类排序算法总结

数据结构-各类排序算法总结 原文转自: https://www.wendangku.net/doc/eb4656266.html,/zjf280441589/article/details/38387103各类排序算法总结 一. 排序的基本概念 排序(Sorting)是计算机程序设计中的一种重要操作,其功能是对一个数据元素集合或序列重新排列成一个按数据元素 某个项值有序的序列。 有n 个记录的序列{R1,R2,…,Rn},其相应关键字的序列是{K1,K2,…,Kn},相应的下标序列为1,2,…,n。通过排序,要求找出当前下标序列1,2,…,n 的一种排列p1,p2,…,pn,使得相应关键字满足如下的非递减(或非递增)关系,即:Kp1≤Kp2≤…≤Kpn,这样就得到一个按关键字有序的记录序列{Rp1,Rp2,…,Rpn}。 作为排序依据的数据项称为“排序码”,也即数据元素的关键码。若关键码是主关键码,则对于任意待排序序列,经排序后得到的结果是唯一的;若关键码是次关键码,排序结果可

能不唯一。实现排序的基本操作有两个: (1)“比较”序列中两个关键字的大小; (2)“移动”记录。 若对任意的数据元素序列,使用某个排序方法,对它按关键码进行排序:若相同关键码元素间的位置关系,排序前与排序后保持一致,称此排序方法是稳定的;而不能保持一致的排序方法则称为不稳定的。 二.插入类排序 1.直接插入排序直接插入排序是最简单的插入类排序。仅有一个记录的表总是有序的,因此,对n 个记录的表,可从第二个记录开始直到第n 个记录,逐个向有序表中进行插入操作,从而得到n个记录按关键码有序的表。它是利用顺序查找实现“在R[1..i-1]中查找R[i]的插入位置”的插入排序。

JAVA数组的排序方法实例

冒泡排序法 1.public class SortArray_01 { 2. public static void main(String args[]) { 3. int[] array = { 14, 5, 86, 4, 12, 3, 21, 13, 11, 2, 55 }; // 创建一个初始化的一维数组array 4. System.out.println("未排序的数组:"); 5. for (int i = 0; i < array.length; i++) { // 遍历array数组中的元素 6. System.out.print(" " + array[i]); // 输出数组元素 7. if ((i + 1) % 5 == 0) // 每5个元素一行 8. System.out.println(); 9. } 10. int mid; // 定义一个中间变量, 起到临时存储数据的作用 11. for (int i = 0; i < array.length; i++) { // 执行冒 泡排序法 12. for (int j = i; j < array.length; j++) { 13. if (array[j] < array[i]) { 14. mid = array[i]; 15. array[i] = array[j]; 16. array[j] = mid; 17. } 18. } 19. } 20. System.out.println("\n使用冒泡法排序后的数组:"); 21. for (int i = 0; i < array.length; i++) { // 遍历排好序的array数组中的元素 22. System.out.print(" " + array[i]); // 输出数组元素 23. if ((i + 1) % 5 == 0) 24. System.out.println(); // 每5 个元素一行 25. } 26. } 27.} 数组递增排序

JAVA中运用数组的四种排序方法

JAVA中在运用数组进行排序功能时,一般有四种方法:快速排序法、冒泡法、选择排序法、插入排序法。 快速排序法主要是运用了Arrays中的一个方法Arrays.sort()实现。 冒泡法是运用遍历数组进行比较,通过不断的比较将最小值或者最大值一个一个的遍历出来。 选择排序法是将数组的第一个数据作为最大或者最小的值,然后通过比较循环,输出有序的数组。 插入排序是选择一个数组中的数据,通过不断的插入比较最后进行排序。下面我就将他们的实现方法一一详解供大家参考。 <1>利用Arrays带有的排序方法快速排序 import java.util.Arrays; publicclass Test2{ publicstaticvoid main(String[] args){ int[] a={5,4,2,4,9,1}; Arrays.sort(a); //进行排序 for(int i: a){ System.out.print(i); } } } <2>冒泡排序算法 publicstaticint[] bubbleSort(int[] args){//冒泡排序算法 for(int i=0;iargs[j]){ int temp=args[i]; args[i]=args[j]; args[j]=temp; } } } return args; } <3>选择排序算法 publicstaticint[] selectSort(int[] args){//选择排序算法 for (int i=0;i

各大常用排序方法

//1. 希尔排序, 时间复杂度:O(nlogn)~ O(n^2) // 另称:缩小增量排序(Diminishing Increment Sort) void ShellSort(int v[],int n) { int gap, i, j, temp; for(gap=n/2; gap>0; gap /= 2) /* 设置排序的步长,步长gap每次减半,直到减到1 */ { for(i=gap; i=0) && (v[j]>v[j+gap]); j -= gap ) /* 比较相距gap远的两个元素的大小,根据排序方向决定如何调换 */ { temp = v[j]; v[j] = v[j+gap]; v[j+gap] = temp; } } } } //2. 二分插入, void HalfInsertSort(int a[], int len) { int i, j, temp; int low, high, mid; for (i=1; i temp) /* 如果中间元素比但前元素大,当前元素要插入到中间元素的左侧 */ { high = mid-1;

} else /* 如果中间元素比当前元素小,但前元素要插入到中间元素的右侧 */ { low = mid+1; } } /* 找到当前元素的位置,在low和high之间 */ for (j=i-1; j>high; j--)/* 元素后移 */ { a[j+1] = a[j]; } a[high+1] = temp; /* 插入 */ } } //3. 插入排序 //3.1 直接插入排序, 时间复杂度:O(n^2) void StraightInsertionSort(int input[],int len) { int i, j, temp; for (i=1; i=0 && input[j]>temp; j--) /* 从当前元素的上一个元素开始查找合适的位置 */ { input[j+1] = input[j]; /* 一边找一边移动元素 */ input[j] = temp; } } } //3.2 带哨兵的直接排序, 时间复杂度:O(n^2) /* * 带哨兵的直接插入排序,数组的第一个元素不用于存储有效数据 * 将input[0]作为哨兵,可以避免判定input[j]中,数组是否越界 * 因为在j--的过程中,当j减小到0时,变成了input[0]与input[0] * 自身进行比较,很明显这个时候说明位置i之前的数字都比input[i]小

java中8大排序方法

Java程序员必知的8大排序本文主要详解了Java语言的8大排序的基本思想以及实例解读,详细请看下文8种排序之间的关系: 1,直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排 好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数 也是排好顺序的。如此反复循环,直到全部排好顺序。 (2)实例

(3)用java实现 1.package com.njue; 2. 3.public class insertSort { 4.public insertSort(){ 5. inta[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17, 18,23,34,15,35,25,53,51}; 6.int temp=0; 7.for(int i=1;i=0&&temp

C C++笔试面试题目汇总3——各种排序算法

C/C++笔试面试题目汇总3——各种排序算法 原文:https://www.wendangku.net/doc/eb4656266.html,/u/1222/showart_318070.html 排序算法是一种基本并且常用的算法。由于实际工作中处理的数量巨大,所以排序算法对算法本身的速度要求很高。而一般我们所谓的算法的性能主要是指算法的复杂度,一般用O方法来表示。在后面我将给出详细的说明。对于排序的算法我想先做一点简单的介绍,也是给这篇文章理一个提纲。 我将按照算法的复杂度,从简单到难来分析算法。 第一部分是简单排序算法,后面你将看到他们的共同点是算法复杂度为O(N*N)(因为没有使用word,所以无法打出上标和下标)。 第二部分是高级排序算法,复杂度为O(Log2(N))。这里我们只介绍一种算法。另外还有几种算法因为涉及树与堆的概念,所以这里不于讨论。 第三部分类似动脑筋。这里的两种算法并不是最好的(甚至有最慢的),但是算法本身比较奇特,值得参考(编程的角度)。同时也可以让我们从另外的角度来认识这个问题。 第四部分是我送给大家的一个餐后的甜点——一个基于模板的通用快速排序。由于是模板函数可以对任何数据类型排序(抱歉,里面使用了一些论坛专家的呢称)。 一、简单排序算法 由于程序比较简单,所以没有加什么注释。所有的程序都给出了完整的运行代码,并在我的VC环境下运行通过。因为没有涉及MFC和WINDOWS的内容,所以在BORLAND C++的平台上应该也不会有什么问题的。在代码的后面给出了运行过程示意,希望对理解有帮助。 1.冒泡法:(Gilbert:点这里有视频) 这是最原始,也是众所周知的最慢的算法了。他的名字的由来因为它的工作看来象是冒泡: #include void BubbleSort(int* pData,int Count) { int iTemp; for(int i=1;i=i;j--) { if(pData[j]

小学语文排序题方法技巧汇总排序

专题——句子 句子之排序 1、考点 定义:排序类题就是把一组顺序错乱的句子按照正确的顺序重新排列,解这类题的关键是要找出这组句子的行文顺序,再把它们重新排列。 2、例题分析 例题1:将下列句子排列正确。 ()科学家对此进行研究。 ()正常人的眼睛能感知这个世界的五彩缤纷,识别红、橙、黄、绿、青、蓝、紫,以及它们之间的各种过渡色,总共约六十多种。 ()如牛、羊、马等,几乎不会分辨颜色,反映到它们眼里的只有黑、白、灰三种颜色,很单调。 ()那么,动物的感色能力又如何呢? ()研究证实,大多数哺乳动物是色盲。 试题分析: 此题着重考察学生的语言组织能力。对于众多的句子如何确定第一句是解此题的关键。接着找出几个句子之间的联系点,这也是至关重要的一个因素。 解题思路: 首先,要通读所有的句子,整体感知这段文字,初步明确这段文字主要写的是什么,围绕什么来写的。在这段文字中,首先写的是人的眼睛对色彩的感知,而后过渡到动物。中间一句设问句是很好的承接,接下来是科学家投入了研究,最后是研究的结果,并以此举例说明。所有的句子试填好后,要将句子按正确的排列顺序通读一遍,最后检查序号是否正确。 参考答案:3 1 5 2 4。 例题2 : 将①-④句填在横线上,顺序恰当的一项是()。 沿池环水四周,新筑一道长600多米的环池路,还有那修复完美的明代遗迹“临流亭”,

四周环水,兀立池中,游客观望,流连忘返。 ①形态各异的飞禽雕塑,浮游水面 ②水上画舫往返,笑声朗朗 ③路面铺设的鹅卵石,在碧波辉映下,色彩鲜艳,晶莹闪烁 ④路边垂柳依依,清风送爽 ③④②① B、④②③① C、③④①② D、④③①② 解题指导: 这是一道在所给的语段中选择恰当的选项填空题。考查的是思维的连贯与严密。解答此类题目,要瞻前顾后,从空缺处的前文或后文找出句与句之间内在的联系,通过上下文要通畅连贯或句式要前后一致等方面来确定正确的选项。 此题空缺处前文是写“环池路”,与之文气连贯的当然是选项中③句,接着介绍“路面”,接着就为第④句介绍“路边”,然后由“沿池环水四周”的“路边”,自然引出第②句,介绍“水上”,最后第①句交待水上的“飞禽雕塑”,则“雕塑”又与后句的“临流亭”同属建筑,自然衔接。所以正确答案为“A”。参考答案:A 例题3 : ()这时,我们才发现社区里的工作人员虽然很多,但是在一些死角里还会看见灰尘。 ()到了社区,同学们都冻得发抖,但又不敢松懈。 ( )虽然很冷,但我们每个人额头上都有豆大的汗珠。 ()有的同学在擦窗户,有的同学在扫水泥地面,有的同学在捡石头,有的同学在除草,还有同学在推小车送垃圾,我也和一些同学捡石块。 ()由于风太大的缘故,扫起来了许多的尘土,把大家呛得直打喷气,但大家都不觉得苦,继续埋头苦干。 ()我们各自分工之后,都开始行动起来了。 ( ) 同学们把自己的活干完之后又去帮忙干别的事了。 解题思路: 乱句排文的练习可以帮助学生训练思维,此题是按事件发展顺序排列,先是事件的起因,再是事件的过程,最后是结果。 题目答案:2 1 7 4 5 3 6

工作总结范文精选:各种排序方法复杂度总结

各种排序方法复杂度总结 一、冒泡排序 主要思路是: 通过交换相邻的两个数变成小数在前大数在后,这样每次遍历后,最大的数就“沉”到最后面了。重复N次即可以使数组有序。 代码实现 voidbubble_sort(intarr[],intlen) for(inti=0;i=i;j――) if(arr[j]

冒泡排序改进2: 记录某次遍历时最后发生数据交换的位置,这个位置之后的数据显然已经有序。因此设置标志位记录每次遍历中最后发生数据交换的位置可以确定下次循环的范围。 二、直接插入排序 主要思路是: 每次将一个待排序的数组元素,插入到前面已排序的序列中这个元素应该在的位置,直到全部数据插入完成。类似扑克牌洗牌过程。 代码实现 void_sort(intarr[],intlen) for(inti=1;i―1&&k

三、直接选择排序 主要思路是: 数组分成有序区和无序区,初始时整个数组都是无序区,每次遍历都从无序区选择一个最小的元素直接放在有序区最后,直到排序完成。 代码实现 voidselect_sort(intarr[],intlen) for(inti=0;i

数据结构各种排序算法总结

数据结构各种排序算法总结 计算机排序与人进行排序的不同:计算机程序不能象人一样通览所有的数据,只能根据计算机的"比较"原理,在同一时间内对两个队员进行比较,这是算法的一种"短视"。 1. 冒泡排序BubbleSort 最简单的一个 public void bubbleSort() { int out, in; for(out=nElems-1; out>0; out--) // outer loop (backward) for(in=0; in a[in+1] ) // out of order? swap(in, in+1); // swap them } // end bubbleSort() 效率:O(N2) 2. 选择排序selectSort public void selectionSort() { int out, in, min; for(out=0; out

3. 插入排序insertSort 在插入排序中,一组数据在某个时刻实局部有序的,为在冒泡和选择排序中实完全有序的。public void insertionSort() { int in, out; for(out=1; out0 && a[in-1] >= temp) // until one is smaller, { a[in] = a[in-1]; // shift item to right --in; // go left one position } a[in] = temp; // insert marked item } // end for } // end insertionSort() 效率:比冒泡排序快一倍,比选择排序略快,但也是O(N2) 如果数据基本有序,几乎需要O(N)的时间 4. 归并排序mergeSort 利用递归,不断的分割数组,然后归并有序数组 效率为O(N*logN),缺点是需要在存储器中有一个大小等于被排序的数据项数目的数组。public void mergeSort() // called by main() { // provides workspace long[] workSpace = new long[nElems]; recMergeSort(workSpace, 0, nElems-1); } //-----------------------------------------------------------

Java各种排序算法

Java排序算法 1)分类: 1)插入排序(直接插入排序、希尔排序) 2)交换排序(冒泡排序、快速排序) 3)选择排序(直接选择排序、堆排序) 4)归并排序 5)分配排序(箱排序、基数排序) 所需辅助空间最多:归并排序 所需辅助空间最少:堆排序 平均速度最快:快速排序 不稳定:快速排序,希尔排序,堆排序。 1)选择排序算法的时候 1.数据的规模; 2.数据的类型; 3.数据已有的顺序 一般来说,当数据规模较小时,应选择直接插入排序或冒泡排序。任何排序算法在数据量小时基本体现不出来差距。考虑数据的类型,比如如果全部是正整数,那么考虑使用桶排序为最优。考虑数据已有顺序,快排是一种不稳定的排序(当然可以改进),对于大部分排好的数据,快排会浪费大量不必要的步骤。数据量极小,而起已经基本排好序,冒泡是最佳选择。我们说快排好,是指大量随机数据下,快排效果最理想。而不是所有情况。 3)总结: ——按平均的时间性能来分: 1)时间复杂度为O(nlogn)的方法有:快速排序、堆排序和归并排序,其中以快速排序为最好; 2)时间复杂度为O(n2)的有:直接插入排序、起泡排序和简单选择排序,其中以直接插入为最好,特别是对那些对关键字近似有序的记录序列尤为如此; 3)时间复杂度为O(n)的排序方法只有,基数排序。 当待排记录序列按关键字顺序有序时,直接插入排序和起泡排序能达到O(n)的时间复杂度;而对于快速排序而言,这是最不好的情况,此时的时间性能蜕化为O(n2),因此是应该尽量避免的情况。简单选择排序、堆排序和归并排序的时间性能不随记录序列中关键字的分布而改变。 ——按平均的空间性能来分(指的是排序过程中所需的辅助空间大小): 1)所有的简单排序方法(包括:直接插入、起泡和简单选择)和堆排序的空间复杂度为O(1); 2)快速排序为O(log n ),为栈所需的辅助空间; 3)归并排序所需辅助空间最多,其空间复杂度为O(n ); 4)链式基数排序需附设队列首尾指针,则空间复杂度为O(rd )。 ——排序方法的稳定性能: 1)稳定的排序方法指的是,对于两个关键字相等的记录,它们在序列中的相对位置,在排序之前和经过排序之后,没有改变。 2)当对多关键字的记录序列进行LSD方法排序时,必须采用稳定的排序方法。 3)对于不稳定的排序方法,只要能举出一个实例说明即可。 4)快速排序,希尔排序和堆排序是不稳定的排序方法。 4)插入排序: 包括直接插入排序,希尔插入排序。 直接插入排序:将一个记录插入到已经排序好的有序表中。 1, sorted数组的第0个位置没有放数据。

关于各种排序方法的比较

各种排序方法的总结 一.直接插入排序 1.时间复杂度 移动次数和比较次数受初始排列的影响。 最好情况o(n) 最坏情况o(n2) 平均情况o(n2) 2.空间复杂度:o(1) 3.算法特点 稳定排序; 算法简便,且容易实现 适用于顺序和链式两种存储结构,链式存储时不需要移动记录,只修改指针; 适合于初始记录基本有序的情况; 当记录无序,且n较大时,不宜采用。 二.折半插入排序 1.时间复杂度 移动次数受初始排列的影响。 最好情况o(nlog2n) 最坏情况o(n2) 平均情况o(n2) 2.空间复杂度 o(1) 3.算法特点 稳定排序; 算法简便,且容易实现 只适用于顺序存储结构,不能用于链式存储结构; 适合记录无序、n较大的情况; 三.希尔排序 1.时间复杂度 2.空间复杂度 o(1) 3.算法特点 不稳定排序,记录跳跃式的移动; 只适用于顺序存储结构,不能用于链式存储结构; 增量序列可以有多种取法,最后一个增量值必须是1; 适合记录无序、n较大的情况; 四.冒泡排序 1.时间复杂度 移动次数和比较次数受初始排列的影响。 最好情况o(n) 最坏情况o(n2) 平均情况o(n2) 2.空间复杂度 o(1) 3.算法特点 稳定排序; 适用于顺序存储结构和链式存储结构; 适合记录无序、n较大时不宜采用; 五.快速排序 1.时间复杂度 移动次数和比较次数受初始排列的影响。

最好情况o(nlog2n) 最坏情况o(n2) 平均情况o(nlog2n) 2.空间复杂度:o(log2n) 递归算法 3.算法特点 不稳定排序; 算法简便,且容易实现 适用于顺序存储结构; 适合记录无序,且n较大情况。 六.直接选择排序 1.时间复杂度 比较次数不受初始排列的影响,移动次数受影响。 最好情况o(n2) 最坏情况o(n2) 平均情况o(n2) 2.空间复杂度 o(1) 3.算法特点 不稳定排序; 适用于顺序存储结构和链式存储结构; 移动记录的次数较多,适合记录占用空间较多时,采用此方法; 七.堆排序 1.时间复杂度 移动次数和比较次数受初始排列的影响。 最好情况o(nlog2n) 最坏情况o(nlog2n) 平均情况o(nlog2n) 2.空间复杂度:o(1) 3.算法特点 不稳定排序; 适用于顺序存储结构; n较小时不宜采用。 八.归并排序 1.时间复杂度 移动次数和比较次数受初始排列的影响。 最好情况o(nlog2n) 最坏情况o(nlog2n) 平均情况o(nlog2n) 2.空间复杂度:o(n) 3.算法特点 稳定排序; 适用于顺序和链式两种存储结构; 九.基数排序 1.时间复杂度 唯一一个不通过比较和移动记录实现排序的方法。 最好情况o(d(n+REDIX)) 最坏情况o(d(n+REDIX)) 平均情况o(d(n+REDIX)) 其中,d表示关键字的位数;n表示关键字的个数;REDIX表示基,即位上关键字的取值范围4.空间复杂度:o(n+REDIX) 5.算法特点 稳定排序; 适用于顺序和链式两种存储结构; 使用条件较多,需要知道各级关键字的主次关系和各级关系字的取值范围。

各种排序方法复杂度总结归纳

各种排序方法复杂度总结归纳 一、冒泡排序 主要思路是: 通过交换相邻的两个数变成小数在前大数在后,这样每次遍历后,最大的数就“沉”到最后面了。重复N次即可以使数组有序。 代码实现 void buadfdsle_sort(int arr[],int len) { for (int i = 0; i { for (int j = len —1; j >= i; j——) { if (arr[j] { int temp = arr[j]; arr[j] = arr[j —1]; arr[j —1] = temp; } } } } 冒泡排序改进1: 在某次遍历中,如果没有数据交换,说明整个数组已经有序,因

此通过设置标志位来记录此次遍历有无数据交换就可以判断是否要继续循环。 冒泡排序改进2: 记录某次遍历时最后发生数据交换的位置,这个位置之后的数据显然已经有序。因此设置标志位记录每次遍历中最后发生数据交换的位置可以确定下次循环的范围。 二、直接插入排序 主要思路是: 每次将一个待排序的数组元素,插入到前面已排序的序列中这个元素应该在的位置,直到全部数据插入完成。类似扑克牌洗牌过程。 代码实现 void _sort(int arr[],int len) { for (int i = 1; i { int j = i —1; int k = arr[i]; while (j > —1 && k { arr[j + 1] = arr[j]; j ——; } arr[j + 1] = k; }

} 三、直接选择排序 主要思路是: 数组分成有序区和无序区,初始时整个数组都是无序区,每次遍历都从无序区选择一个最小的元素直接放在有序区最后,直到排序完成。 代码实现 void select_sort(int arr[],int len) { for (int i = 0; i { int index = i; for (int j = i + 1; j { if (arr[j] index = j; } if (index != i) { int temp = arr[i]; arr[i] = arr[index]; arr[index] = temp; } } }

各种排序算法小结

各种排序算法小结 排序算法是一种基本并且常用的算法。由于实际工作中处理的数量巨大,所以排序算法对算法本身的速度要求很高。而一般我们所谓的算法的性能主要是指算法的复杂度,一般用O方法来表示。在后面我将给出详细的说明。 对于排序的算法我想先做一点简单的介绍,也是给这篇文章理一个提纲。我将按照算法的复杂度,从简单到难来分析算法。第一部分是简单排序算法,后面你将看到他们的共同点是算法复杂度为O(N*N)(因为没有使用word,所以无法打出上标和下标)。第二部分是高级排序算法,复杂度为O(Log2(N))。这里我们只介绍一种算法。另外还有几种算法因为涉及树与堆的概念,所以这里不于讨论。第三部分类似动脑筋。这里的两种算法并不是最好的(甚至有最慢的),但是算法本身比较奇特,值得参考(编程的角度)。同时也可以让我们从另外的角度来认识这个问题。第四部分是我送给大家的一个餐后的甜点——一个基于模板的通用快速排序。由于是模板函数可以对任何数据类型排序(抱歉,里面使用了一些论坛专家的呢称)。 现在,让我们开始吧: 一、简单排序算法 由于程序比较简单,所以没有加什么注释。所有的程序都给出了完整的运行代码,并在我的VC环境 下运行通过。因为没有涉及MFC和WINDOWS的内容,所以在BORLAND C++的平台上应该也不会有什么 问题的。在代码的后面给出了运行过程示意,希望对理解有帮助。 1.冒泡法: 这是最原始,也是众所周知的最慢的算法了。他的名字的由来因为它的工作看来象是冒泡: #include void BubbleSort(int*pData,int Count) { int iTemp; for(int i=1;i=i;j--) { if(pData[j]10,9,7,8->10,7,9,8->7,10,9,8(交换3次) 第二轮:7,10,9,8->7,10,8,9->7,8,10,9(交换2次) 第一轮:7,8,10,9->7,8,9,10(交换1次) 循环次数:6次 交换次数:6次 其他: 第一轮:8,10,7,9->8,10,7,9->8,7,10,9->7,8,10,9(交换2次) 第二轮:7,8,10,9->7,8,10,9->7,8,10,9(交换0次) 第一轮:7,8,10,9->7,8,9,10(交换1次) 循环次数:6次 交换次数:3次 上面我们给出了程序段,现在我们分析它:这里,影响我们算法性能的主要部分是循环和交换,显然,次数越多,性能就越差。从上面的程序我们可以看出循环的次数是固定的,为1+2+...+n-1。写成公式就是1/2*(n-1)*n。现在注意,我们给出O方法的定义:

Java数据结构和算法笔记

Java数据结构和算法 第0讲综述 参考教材:Java数据结构和算法(第二版),[美] Robert lafore 1. 数据结构的特性 数据结构< 缺点 优点 数组插入快;如果知道下标,可以非常快地存取查找慢,删除慢,大小固定 有序数组比无序的数组查找快删除和插入慢,大小固定 提供后进先出方式的存取存取其他项很慢 < 栈 队列提供先进先出方式的存取存取其他项很慢 链表插入快,删除快— 查找慢 二叉树查找、插入、删除都快(如果树保持平衡)删除算法复杂 红-黑树查找、插入、删除都快;树总是平衡的算法复杂 算法复杂 2-3-4树` 查找、插入、删除都快;树总是平衡的;类 似的树对磁盘存储有用 哈希表如果关键字已知,则存储极快;插入快删除慢,如果不知道关键字则存 储很慢,对存储空间使用不充分堆插入、删除快;对大数据项的存取很快对其他数据项存取慢 对现实世界建模有些算法慢且复杂 》 图 2. 经典算法总结 查找算法:线性查找和二分查找 排序算法: 用表展示 ! 第一讲数组 1.Java中数组的基础知识 1)创建数组

在Java中把数组当作对象来对待,因此在创建数组时必须使用new操作符: < 一旦创建数组,数组大小便不可改变。 2)访问数组数据项 3)数组的初始化 当创建数组之后,除非将特定的值赋给数组的数据项,否则它们一直是特殊的null对 等效于下面使用new来创建数组并初始化: | 2.面向对象编程方式 1)使用自定义的类封装数组

| # !

子问题须与原始问题为同样的事,且更为简单; b. 不能无限制地调用本身,须有个出口,化简为非递归状况处理。 1.三角数字 该数列中的首项为1,第n项是由第n-1项加n后得到的。 1)使用循环查找第n项

十 大 经 典 排 序 算 法 总 结 超 详 细

前端资源收集 前端资-源收集 收集的资-源 44个 Javascript 变态题解析 javascript 变态题解析 正则表达式收集 正则表达式收集 十大经典排序算法总结(JavaScript描述)排序算法的总结 前端工具库汇总 前端工具库总结 怎么学JavaScript? 学习javascript 的学习指导 不定期更新 JavaScript技巧 javascript 编码技巧总结 H5项目常见问题汇总及解决方案 高质量的常见问题汇总 廖雪峰的 git 教-程 Git忽略规则.gitignore梳理 git 配置提交规则 全局环境,执行环境

setTimeout promises 很酷,但很多人并没有理解就在用了 promises 使用错误汇总 promises webpack 2 中文文档 输入url后的加载过程 详细解答从输入URL 到页面显示的过程 数组Array.prototype方法 介绍了数组的一些新的方法 移动端真机调试 Web 客户端存储 ESLint中文指南 webpack 2 集成ESLint react-webpack2-skeleton webpack 2 react 成功案例,包括热加载 cookie 小结 CSS定制多行省略 Ajax 知识体系大梳理 js+nodejs完成文件上传 用 webpack 实现持久化缓存 搜罗一切webpack的好文章好工具 深入理解 CSS:字体度量、line-height 和 vertical-align

原生JS中DOM节点相关API合集 正则表达式前端使用手册 聊一聊H5应用缓存-Manifest fetch进阶指南 mozilla 开发者网络 深入理解javascript原型和闭包系列JavaScript深入系列 深度长文 JavaScript数组所有API全解密你真的懂 JavaScript 的正则吗?webpack2 终极优化 文件上传那些事儿 写给前端工程师的DNS基础知识 初识weex(前端视角) - 环境搭建 前端命名规范 正则表达式 总有你要的编程书单(GitHub )JavaScript深入系列 javascript 的一些功能点 如何在小程序中调用本地接口 移动端浏览器调试方法汇总 HTML5移动开发中的input输入框类型 互联网协议入门

相关文档
相关文档 最新文档