`
luliangy
  • 浏览: 95182 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

各种常用排序算法分析

 
阅读更多

各种常用排序算法分析

 

一、选择排序

很简单就是依次从要排序的数据中选择最小()的,第二小().........

看代码:

  /**

 * 选择排序;

 * @param array

 * @param left

 * @param right

 */

public static void selectSort(int[] array,int left,int right){

for(int i=0;i<right-left+1;i++){

selectMin(array,left+i,right);

}

}



   /**

 * 选择最小的元素--将数组中的元素移动到第一位;

 * @param array

 * @param left

 * @param right

 * @return

 */

public static void selectMin(int[] array,int left,int right){



if(left==right){//只有一个元素;

return;

}else{

for(int i=left+1;i<right;i++){

if(array[i]<array[left]){

//交换元素;

int temp=0;

temp=array[i];

array[i]=array[left];

    array[left]=temp;

}

}

}



}

 

 

 分析一下算法的复杂度:时间O(n2),空间O(1);

 

二、直接插入排序

我觉得这种排序特别适合链表这种在逻辑上连续在物理上不连续的数据结构,否则需要反复的移动数据;

直接插入排序就是将要插入的元素插入已经排好序的顺序表中,使得插入以后的顺序表任然有序;

代码:

 /**

 * 插入排序;

 * @param array

 * @param left

 * @param right

 */

public static void insertSort(int[] array,int left,int right){



for(int i=1;i<array.length;i++){

arrayAdjust(array,0,i);

}



}



/**

 * 将数组调整--认为数组前n-1个元素是有序的最后一个元素待插入;

 * @param array

 * @param low

 * @param high

 */

public static void arrayAdjust(int[] array,int low,int high){

int e=array[high];

for(int i=low;i<high;i++){

if(e<array[i]){

//移动元素并插入;

for(int j=high-1;j>=i;j--){

array[j+1]=array[j];

}

//赋值;

array[i]=e;

break;

}

}

}

 

 

  很明显在链表中可以省去移动数据的操作,显得简单了许多。

算法复杂度分析:O(n2);

 

 

三、归并排序

归并排序就是将两个已经排好序的序列合并成一个有序的序列;

 代码:

/**

 * 归并排序;

 * 

 * @param a

 * @param left

 * @param right

 */

public static void mergeSort(int[] a, int left, int right) {



if (right > left) {



// 取得中间值;

int mid = (left + right) / 2;

// 左归并;

mergeSort(a, left, mid);

// 右归并;

mergeSort(a, mid + 1, right);

// 排序之后再归并;

merge(a, left, mid, right);



}



}

/**

 * 归并;

 * 

 * @param array

 * @param low

 * @param mid

 * @param high

 */

public static void merge(int[] array, int low, int mid, int high) {



// 开辟两个数组;

int[] a = new int[mid - low + 1];// 左边数组;

int[] b = new int[high - mid];// 右边数组;



int i, j;

// 拷贝元素;

for (i = 0; i < a.length; i++) {

a[i] = array[i + low];

}

for (j = 0; j < b.length; j++) {

b[j] = array[mid + j + 1];

}



i = j = 0;

int k = 0;

// 归并;

while (i < a.length && j < b.length) {

if (a[i] < b[j]) {

array[low+k++] = a[i++];

} else {

array[low+k++] = b[j++];

}

}



// 剩余拷贝;

if (i < a.length) {

for (; i < a.length; i++) {

array[low+k++] = a[i];

}

} else {

for (; j < b.length; j++) {

array[low+k++] = b[j];

}

}



}

 

 

   归并排序是一种比较稳定的排序,但是它有一个不好的地方是在归并的时候必须要开辟新的空间来存储数据,所以它的空间复杂度较高,对于内存要求较高的程序来说不推荐使用归并排序。

算法复杂度分析:O(nlogn);

四、快速排序

效率很高的排序方式啊,ACM强烈推荐

/**

 * 快速排序;

 * @param array

 * @param low

 * @param high

 */

public static void quickSort(int[] array,int left,int right){



if(left<right){



int flag=partition(array, left, right);

//递归调用快速排序算法;

quickSort(array,left,flag-1);

quickSort(array,flag+1,right);



}



}



/**

 * 调整数组;

 * @param array

 * @param low

 * @param high

 * @return

 */

public static int partition(int[] array,int low,int high){



//取得标志;

int pivot=array[low];

int temp=0;//临时变量;



while(low<high){



while(low<high&&array[high]>=pivot){

high--;

}



//交换;

temp=array[high];

array[high]=array[low];

array[low]=temp;

while(low<high&&array[low]<=pivot){

low++;

}



//交换;

temp=array[high];

array[high]=array[low];

array[low]=temp;

}



return low;



}

 

 

平均效率较高是O(nlogn),不好的地方是它是一种不稳定的排序方式,如果每次划分的元素是有一边只有一个,那么就没有得到很好的划分,所以此时运行时间较高。较好的情况是每次划分都比较均衡,复杂度能达到nlogn

五、堆排序

堆排序虽然有的时候效率没有快速排序那么高,但是它是一种稳定的排序 ,排序实现利用大根堆(小跟堆)的性质来完成排序,将数组看成一个完全二叉树,然后我们在排序的时候要反复的来建堆。取得堆顶元素,调整到堆的末尾。

代码:

/**

 * 堆排序算法;

 * @param array

 * @param length

 */

public static void heapSort(int[] array,int length){



//先建堆将第一个元素调整为最大的元素;

for(int i=length/2-1;i>=0;i--){

maxHeapfy(array,i,length);

}



    int temp=0;

//堆排序;

//反复建堆;

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

//堆顶先和堆的最后一个元素交换;

temp=array[0];

array[0]=array[i];

array[i]=temp;

//在将0-i调整为一个大根堆;

maxHeapfy(array,0,i);

}



}



/**

 * 将堆调整为大根堆--以pos为堆顶;

 * @param array

 * @param pos--起始位置;

 * @param len--数组的长度;

 */

public static void maxHeapfy(int[] array,int pos,int len){



//节点孩子的位置

int left=2*pos;

int right=2*pos+1;



int largest=0,temp;

//取得最大元素的位置;

if(left<len&&array[left]>array[pos]){

largest=left;

}

if(right<len&&array[right]>array[largest]){

largest=right;

}else{

largest=pos;

}



if(largest!=pos){//不相等交换堆顶元素;

temp=array[largest];

array[largest]=array[pos];

array[pos]=temp;



//递归调用;

maxHeapfy(array,largest,len);



}



}

 

 

各种排序还有很多种应用,今晚累了,且听下回分解!

<!--EndFragment-->

分享到:
评论

相关推荐

    常用排序算法分析与实现(Java版)

    用java对常用排序算法进行分析与实现.包含: 插入排序 直接插入排序、希尔排序 • 选择排序 简单选择排序、堆排序 • 交换排序 冒泡排序、快速排序 • 归并排序 • 基数排序

    内部排序算法分析

    数据结构 内部排序算法分析 c语言代码

    实验六 常用排序算法的对比分析

    石家庄铁道大学 刘立嘉 算法与数据结构 实验六 常用排序算法的对比分析

    各种常用排序算法及时间性能分析

    该程序包括常用的排序算法代码:直接插入排序,二分插入排序,...同时通过产生一个指定个数的随机数组,调用各种不同排序算法对其进行排序,记录各种算法的耗时,写入一个文本文件进行对比分析各种排序算法的时间性能。

    常用排序算法的比较

    利用随机函数产生N个随机整数,采用多种方法对这些数进行排序,然后分析各自的所需的排序时间找出较快的排序算法。 要求: 1) 分别采用的排序算法有插入排序、希尔排序、起泡排序、快速排序、选择排序、堆排序、归并...

    算法设计与分析-1排序算法性能分析-冒泡/选择/插入/合并/快速排序-pre ppt

    排序算法性能分析 选择排序 冒泡排序 插入排序 合并排序 快速排序算法原理及代码实现 不同排序算法时间效率的经验分析方法 验证理论分析与经验分析的一致性 当面临巨大数据量的排序的时候,还是优先选择合并排序算法...

    内排序算法比较,六种排序算法分析

    1) 对以下6种常用的内部排序算法进行比较:起泡排序,直接插入排序,简单选择排序,快速排序,希尔排序,堆排序。 2) 待排序记录的文件个数不小于1000( 其数据用伪随机数产生),至少用5组不同的输入数据作比较;比较...

    常用排序算法分析与实现(Java版)

    常用排序算法分析与实现(Java版),针对使用java代码编写

    《常用排序算法的比较》PDF格式论文

    《福建电脑报》上的一篇文章,作者为滨州学院的刘春霞、常璐璐,以前读过,上传以便继续研究,在此对作者表示感谢。... 本文列举出几种常用排序的基本思想、算法实现及算法分析.并给出这些排序算法的比较和选择。

    各种排序算法的实验(源代码+实验报告)

    C++实现的各种排序算法的实验(源代码+实验报告),包括快速排序,堆排序等的实现

    内部排序算法比较 数据结构课程设计

    1、本演示程序对以下6种常用的内部排序算法进行实测比较:起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序。 2、待排序表的表的元素的关键字为整数,表长不小于100;其中的数据要用伪随机数产生...

    常用排序算法分析与实现

    这是一些常用的排序算法思想的分析和JAVA实现,还有具体的图解实例,简单明了,一看就会!

    常用排序算法的对比分析

    对以下常用的内部排序算法进行比较:起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序。 [测试数据] 由随机产生器决定。 [实现提示] 待排序表的表长不少于100;其中的数据要用伪随机数产生...

    用C语言实现常用排序算法

    利用随机函数产生30000个随机整数,利用插入排序、起泡排序、选择排序、快速排序、堆排序、归并排序等排序方法进行排序,并且 (1) 统计每一种排序上机所花费的时间。 (2) 统计在完全正序,完全逆序情况下记录的比较...

    排序算法 各种算法的综合

    排序算法是一种基本并且常用的算法。由于实际工作中处理的数量巨大,所以排序算法 对算法本身的速度要求很高。 而一般我们所谓的算法的性能主要是指算法的复杂度,一般用O方法来表示。在后面我将 给出详细的说明...

    数据结构实验-排序算法

    1、创建排序类。 2、提供操作:选择排序、冒泡排序、插入排序、基数排序、快速排序、归并排序。(快速排序、归并排序讲到之后再做) 3、*能够显示各种排序算法的中间过程。

    常用排序算法比较与分析报告.pdf

    常用排序算法比较与分析报告.pdf

    内部排序算法比较

    在教科书中,各种内部排序算法的时间复杂度分析结果只给出算法的大致执行时间。试通过随机数据比较各算法的关键字比较次数和关键字移动次数,以获得直观感受 【基本要求】 (1) 对6种常用内部排序算法进行比较:...

Global site tag (gtag.js) - Google Analytics