`

简单总结下各种排序算法

 
阅读更多
	public static void bubbleSort(int[] c){
		for(int i=0,len=c.length;i<len;i++){
			for(int j=0;j<len-i-1;j++){
				if(c[j]>c[j+1]){
					Helper.swap(c, j+1, j);
				}
			}
		}
	}
	public static void selectionSort(int[] c){
		for(int i=0,len=c.length;i<len;i++){
			int k=i;
			for(int j=i+1;j<len;j++){
				if(c[j]<c[k])k=j;
			}
			if(k!=i){
				Helper.swap(c, i, k);
			}
		}
	}

public static void insertionSort(int[] a){
		for(int i=1,len=a.length;i<len;i++){
			int j=i;
			while(j>0){
				if(a[j]<a[j-1]){
					Helper.swap(a,j,j-1);
				}
				j--;
			}
		}
	}

	public static void quickSort2(int[] c,int begin,int end){
//update 2012/7/1
		if(c==null||c.length<2){
				return;
			}
		 if(begin>end)return; 
		 int len = c.length;
		 if(begin<end&&(0<=begin&&begin<len)&&(0<=end&&end<len)){
			 int point=c[begin];  
		     int i=begin,j=end;  
		     int index=i;  
		     while(i<j){ 
		    	 while(c[j]>=point&&i<j)j--;  
		         if(i<j){  
		             c[index]=c[j];  
		             index=j;  
		         } 
		         while(c[i]<=point&&i<j)i++;  
		         if(i<j){  
		             c[index]=c[i];  
		             index=i;  
		         }  
		     }  
		     c[index]=point;  
		     quickSort2(c,begin,i-1);  
		     quickSort2(c,i+1,end); 
		 }
	}
	public static void quickSort(int[] c,int begin,int end){
		if(begin>end)return;
		int low=begin;
		int high=end;
		boolean flag=true;
		while(low!=high){
			if(c[low]>c[high]){
				Helper.swap(c, low, high);
				flag=!flag;
			}
			if(flag){
				high--;
			}else{
				low++;
			}
		}
		quickSort(c,begin,low-1);
		quickSort(c,high+1,end);
	}
	
        
    /**
     * 用最大堆实现“就地”升序排序
     * 思路:
     * 1.“自下而上”,将整个数组初始化建成一个最大堆
     *   从最右下方的子堆——也就是以最后一个非叶子结点为根结点(lastRootindex)的子堆——开始,
     *   调整各个子堆使之为最大堆,最后使得整个数组成为一个最大堆
     *   注意到从 0, 1, 2, ...lastRootIndex 的结点都是非叶子结点,都作为子堆需要调整
     * 2.将当前堆顶元素(最大元素)与堆的最后一个元素交换,这样,当前最大值就排到末尾了
     * 3.将堆的大小减1(排除最后一个元素),重新调整使得堆仍为最大堆,直到排序完毕
     *   注意这时候的调整是“自上而下”,选举出当前的最大值放至堆顶
     */
    public static void heapsort(int[] array) {
        int lastIndex = array.length - 1;
        int lastRootIndex = (lastIndex - 1) / 2;
        for (int root = lastRootIndex; root >= 0; root--) {
            reheap(array, root, lastIndex);
        }
        for (int last = lastIndex; last >= 0; last--) {
            swap(array, 0, last);
            reheap(array, 0, last - 1);     //堆大小减1
        }
        System.out.println(Arrays.toString(array));
    }

    /**
     * 调整使之仍为最大堆
     * @param heap heap是这样一个“半堆”:执行调整操作前是一个最大堆。将最大堆的堆顶元素移除,并替换为最大堆的最后一个元素,成为“半堆”
     * @param rootIndex “半堆”的根
     * @param lastIndex “半堆”的最后一个元素
     */
    public static void reheap2(int[] heap, int rootIndex, int lastIndex) {
        int orphan = heap[rootIndex];
        int leftIndex = rootIndex * 2 + 1;
        boolean done = false;
        while (!done && leftIndex <= lastIndex) {
            int largeIndex = leftIndex;
            int rightIndex = leftIndex + 1;
            if (rightIndex <= lastIndex && heap[rightIndex] > heap[leftIndex]) {
                largeIndex = rightIndex;
            }
            if (heap[largeIndex] > orphan) {
                heap[rootIndex] = heap[largeIndex];
                rootIndex = largeIndex;
                leftIndex = rootIndex * 2 + 1;
            } else {
                done = true;
            }
        }
        heap[rootIndex] = orphan;

    }


	public static void mergeSort(int[] c,int low,int high,int[] tmp){
		if(low>=high)return;
		int mid=(high&low)+((high^low)>>1);
		mergeSort(c,low,mid,tmp);
		mergeSort(c,mid+1,high,tmp);
		merge(c,low,mid,high,tmp);
	}
	public static void merge(int[] c,int low,int mid,int high,int[] tmp){
		int begin01=low;
		int end01=mid;
		int begin02=mid+1;
		int end02=high;
		int k=0;
		while(begin01<=end01&&begin02<=end02){
			if(c[begin01]<c[begin02]){
				tmp[k]=c[begin01];
				k++;
				begin01++;
			}else{
				tmp[k]=c[begin02];
				k++;
				begin02++;
			}
		}
		while(begin01<=end01){
			tmp[k++]=c[begin01++];
		}
		while(begin02<=end02){
			tmp[k++]=c[begin02++];
		}
		System.arraycopy(tmp, 0,  c,low, k);
	}
1
0
分享到:
评论
3 楼 bylijinnan 2012-06-29  
neyshule 写道
quicksort2是不是有问题,c[i]<=point?

嗯 我当时没考虑有相等的情况
2 楼 neyshule 2012-06-27  
quicksort2是不是有问题,c[i]<=point?
1 楼 pywepe 2012-02-05  
备忘,,希望没有错误

相关推荐

    总结了各种排序算法,并用C++代码实现,并有演示

    本资源"总结了各种排序算法,并用C++代码实现,并有演示",提供了丰富的学习材料,包括不同类型的排序算法以及它们的C++实现,还有可能的可视化演示,帮助理解每种算法的工作原理。 首先,让我们逐一了解常见的排序...

    各种排序算法总结(ppt)

    在这个名为“各种排序算法总结(ppt)”的资料中,我们将会深入探讨多种常见的排序算法,包括它们的基本原理、优缺点以及实际应用。** 首先,我们要了解排序的目的是为了使数据有序,这在数据处理和分析中具有广泛...

    各种排序算法的稳定性和时间复杂度总结

    ### 各种排序算法的稳定性和时间复杂度总结 #### 排序算法的稳定性与时间复杂度概述 在计算机科学中,排序算法是基础且重要的组成部分,用于将一系列数据按照特定顺序排列。排序算法的效率通常由其时间复杂度决定...

    几种排序算法总结及比较

    快速排序通常被认为是最快的通用排序算法,但在某些特定情况下,如数据量较小或内存有限时,其他简单排序算法可能会更合适。因此,了解这些排序算法的原理和性能特点对于编写高效的代码至关重要。

    查找算法和排序算法小结

    本文总结了常见的查找算法和排序算法,包括顺序查找、二分查找、选择排序、冒泡排序、二分排序、插入排序、希尔排序、堆排序、归并排序等。 一、查找算法 1. 顺序查找(Sequential Search) 顺序查找是一种简单...

    八大排序算法总结

    【排序算法总结】 排序是计算机科学中的一项基本操作,它涉及到如何有效地重新排列一组数据,使其按照特定的顺序排列。本文将重点介绍八大排序算法,包括插入排序、希尔排序、交换排序、快速排序、选择排序、堆排序...

    各种排序算法小结

    ### 各种排序算法小结 #### 一、引言 排序算法是在计算机科学中非常基础且常用的一类算法。由于在实际应用中往往需要处理大量数据,因此对排序算法的效率有着较高要求。通常,我们会关注算法的时间复杂度来评估其...

    十大经典排序算法总结.docx

    《十大经典排序算法总结》 排序算法是计算机科学的基础,其设计思想和效率对软件的性能有着直接影响。本文主要探讨了十种经典的排序算法,包括它们的设计思路、优缺点以及适用场景,帮助我们理解排序算法的核心。 ...

    C#排序算法总结

    以上就是对C#排序算法的一个总结,包含了最基础的冒泡排序及其优化版选择排序和快速排序,还包括了直接插入排序和折半插入排序,每种排序算法都有其特点和适用场景,理解这些排序算法可以帮助我们在不同的数据量和...

    排序算法总结.doc

    插入排序是一种简单的排序算法,其时间复杂度为O(n^2)。它通过将每个元素插入到已排序的部分中找到正确位置来工作,保持已排序部分的稳定性。当数组近乎有序时,插入排序表现出较好的性能。由于它主要涉及元素的...

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

    一、问题描述 本项目旨在实现并比较六...总结,这个项目提供了对C语言实现的排序算法的深入理解和实践,通过对各种排序方法的性能测试,我们可以更好地理解它们在不同场景下的适用性,并为实际问题选择合适的排序算法。

    常用排序算法总结

    ### 常用排序算法总结 #### 一、冒泡排序 冒泡排序是一种简单的排序算法,它重复地遍历待排序的数列,依次比较相邻的两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复进行的,直到没有再需要...

    排序算法总结文档

    插入排序是一种简单直观的排序算法,它将数组分为已排序和未排序两部分,然后逐个将未排序元素插入到已排序部分的正确位置。对于小规模或者接近有序的数据,插入排序的效率较高。其时间复杂度在最好情况下(已排序...

    Java各种排序算法

    【Java各种排序算法详解】 排序算法是计算机科学中不可或缺的一部分,尤其在编程语言如Java中,理解并掌握各种排序算法的原理与应用至关重要。本文将详细介绍几种常见的Java排序算法,包括它们的工作机制、优缺点...

    最经典的8大排序算法总结

    在本篇总结中,将探讨8种经典的排序算法,分别是冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序、二叉树排序和基数排序。 1. 冒泡排序(Bubble Sort): 冒泡排序是一种简单的排序算法。它重复地遍历要...

    数据结构中各种排序算法的比较与分析

    ### 数据结构中各种排序算法的比较与分析 #### 排序的基本概念 排序是指按照一定的规则(例如数值大小、字母顺序等)对一组数据进行重新排列的过程。在计算机科学领域,排序是一种基本的操作,用于组织数据以便...

    各种排序算法总结

    下面列出了一些常见的排序算法。这里面插入排序和冒泡排序又被称作简单排序,他们对空间的要求不高,但是时间效率却不稳定;而后面三种排序相对于简单排序对空间的要求稍高一点,但时间效率却能稳定在很高的水平。...

    八种常见排序算法总结(转)

    "八种常见排序算法总结" 直接插入排序是一种简单的排序算法,它的思想是每次选择一个元素 K 插入到之前已排好序的部分 A[1…i]中,插入过程中 K 依次由后向前与 A[1…i]中的元素进行比较。若发现 A[x]&gt;=K,则将 K ...

    排序查找算法总结

    在各种排序算法中,每种算法都有其特点和应用场景。本文将对10种经典的排序算法进行总结,并对每种算法的时间复杂度、空间复杂度和适用场景进行分析。 一、冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序算法...

    算法与数据结构的排序算法

    总结,排序算法是计算机科学中的基础工具,理解和掌握各种排序算法的原理、优缺点以及应用场景,对于提升编程技能和解决实际问题具有重要意义。通过对"排序.c"文件的分析,我们可以更直观地理解这些理论知识,并将其...

Global site tag (gtag.js) - Google Analytics