`
cjf068
  • 浏览: 34413 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

基本的排序算法

 
阅读更多
插入排序
选择排序
快速排序
。。。。
后续补充
package org.jf.alg.sort;

/**
 * 
 * 数组排序工具类
 * 
 * 数组中不能有空元素
 * 
 * @author junfeng.chen
 *
 */
public class Sorter {
	
	
	/**
	 * 
	 * 选择排序
	 * 算法思想:将待排序的集合分为两部分,一部分为已排序的部分,一部分为未排序部分
	 * 开始时,未排序部分为整个集合,已排序部分为空
	 * 算法步骤:
	 * 每次从待排序的集合中找出最大(或最小)的元素,将该元素与集合中第一个元素交换;此时该
	 * 元素及以前的元素都为排好序的
	 * 
	 * i<-- [0 - size-1]
	 *   j<-- [i+1 - size-1]//未排好序的元素 i-size-1
	 *    find min from [i+1 - size - 1]
	 *   
	 *  exchange min and a[i]  
	 *   
	 * O(n2)
	 * @param objs
	 */
	public static  void selectSort(Comparable [] objs)
	{
		if(objs==null || objs.length<=1)
			return;
		
		for(int i=0;i<objs.length-1;i++)
		{
			Comparable little = objs[i];
			int little_indx = i;
			for(int j=i+1;j<=objs.length-1;j++)
			{
				if(objs[j].compareTo(little)<0)
				{
					little = objs[j];
					little_indx = j;
				}
			}
			if(little_indx != i)
			{
				Comparable tmp = objs[i];
				objs[i] = objs[little_indx];
				objs[little_indx] = tmp;
			}
		}
	}

	
	/**
	 * 
	 * 将数组分成两部分,一部分为已排序不分,另一部分未排序
	 * 开始时,已排序不分为空集合;未排序不分为整个数组
	 * 每次取未排序部分的第一个元素,插入到已排序部分的适当位置
	 * 
	 * 
	 * 插入排序
	 * @param objs
	 */
	public static void insertSort(Comparable objs[])
	{
		
		for(int i=0;i<objs.length;i++)
		{
			Comparable max = objs[i];
			
			for(int j=0;j<i;j++)
			{
				if(objs[j].compareTo(max)>0)//找到位置
				{
					for(int k = i;k>j;k--)//后面的元素 依次后移
					{
						objs[k] = objs[k - 1];
					}
					objs[j]=max;
					break;
				}
			}
		}
		
	}
	
	
	
	/**
	 * 
	 *取首元素作为基准
	 * @param objs
	 * @param start
	 * @param end
	 */
	public static int partition(Comparable objs[],int  start,int end)
	{
		Comparable pivot = objs[start];
		int left = start;
		int right = end;
		while(left < right)
		{
			while(pivot.compareTo(objs[right])<0)
				right --;
			while(left < right &&
					pivot.compareTo(objs[left])>=0)
			{
				left ++ ;
			}
			
			if(left < right)
			{
				Comparable tmp = objs[left];
				objs[left] = objs[right];
				objs[right] = tmp;
			}

		}
		int pos = right;
		objs [start] = objs[pos];
		objs [pos] = pivot;
		
		return pos;
	}
	
	/**
	 * 三数取中 作为基准
	 * @param objs
	 * @param start
	 * @param end
	 * @return
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public static int partition2(Comparable objs[],int start,int end)
	{
		int left = start;
		int right = end;
		int mid_indx = (left+right)/2;
		Comparable mid = objs[(left+right)/2];
		if(objs[left].compareTo(mid)<0)
		{
			if(mid.compareTo(objs[right])<=0)
				mid_indx =mid_indx ;//pivot = mid;
			else
			{
				if( objs[left].compareTo(objs[right])>0)
					mid_indx = left;//pivot = objs[left];
				else 
					mid_indx = right;//pivot = objs[right];
			}
		}else
		{
			if(mid.compareTo(objs[right])>=0)
				mid_indx = mid_indx;//pivot = mid;
			else
			{
				if(objs[left].compareTo(objs[right])>=0)
					mid_indx = right;//pivot = objs[right];
				else
					mid_indx = left;//pivot = objs[left];
				
			}
		}
		
		Comparable tp = objs[start];
		objs[start] = objs[mid_indx];
		objs[mid_indx] = tp;
		
		Comparable pivot = objs[start];
		while(left < right)
		{
			while(pivot.compareTo(objs[right])<0)
				right --;
			while(left < right &&
					pivot.compareTo(objs[left])>=0)
			{
				left ++ ;
			}
			
			if(left < right)
			{
				Comparable tmp = objs[left];
				objs[left] = objs[right];
				objs[right] = tmp;
			}
		}
		int pos = right;
		objs [start] = objs[pos];
		objs [pos] = pivot;
		
		return pos;
	}
	
	public static  void quickSort(Comparable objs[],int start,int end)
	{
		if(start >= end)
			return;
		int pos = partition2(objs,start,end);
		quickSort(objs,start,pos -1);
		quickSort(objs,pos+1,end);
	}
	
	/**
	 * 快速排序
	 * 采用3位取中法 定基准
	 * @param objs
	 */
	public static void quickSort(Comparable objs[])
	{
		quickSort(objs,0,objs.length-1);
	}
}	

分享到:
评论

相关推荐

    7种基本排序算法

    本文将详细介绍七种基本排序算法,包括插入排序、快速排序、希尔排序、归并排序、选择排序、冒泡排序(以及双向冒泡排序)和堆排序,这些都是用C语言实现的。对于初学者来说,理解和掌握这些算法有助于提升编程技能...

    8种基本排序算法2015上

    根据提供的信息,我们可以总结出以下关于八种基本排序算法中的两种——冒泡排序(Bubble Sort)与插入排序(Insert Sort)的知识点。 ### 冒泡排序(Bubble Sort) #### 定义 冒泡排序是一种简单的排序算法。它...

    c#实现基本排序算法

    本文将详细探讨C#语言中实现的几种基本排序算法,包括冒泡排序、鸡尾酒排序(双向冒泡)、选择排序、插入排序、希尔排序、堆排序和归并排序。 首先,我们来看**冒泡排序**,它是最简单的排序算法之一。通过不断交换...

    基本排序算法综合实验.docx

    本文档是一个关于基本排序算法的综合实验报告,包括实验条件、源程序代码、算法实现等内容。下面我们将对实验报告中涉及的知识点进行详细的解释和分析。 一、实验条件 实验条件是指进行排序算法实验的硬件和软件...

    五大基本排序算法,算法数据结构(01)

    【五大基本排序算法详解】 排序算法是计算机科学中不可或缺的一部分,它们用于整理和组织数据,使其按照特定的顺序排列。本文将详细介绍五大基本排序算法,包括选择排序、冒泡排序和快速排序,这些都是数据结构和...

    基本排序算法(c语言版)

    本文将深入探讨在C语言中实现的几种基本排序算法,包括冒泡排序、插入排序、选择排序、快速排序、希尔排序以及归并排序。这些算法各有优劣,适用于不同的场景。 1. 冒泡排序(Bubble Sort) 冒泡排序是一种简单的...

    java实现的八种基本排序算法(有注释)

    以下是标题"java实现的八种基本排序算法(有注释)"所涵盖的八种排序算法的详细说明: 1. **冒泡排序(Bubble Sort)**: 冒泡排序是一种简单的交换排序,通过不断比较相邻元素并交换位置,使最大或最小的元素逐渐...

    基本排序算法C语言实现

    本资源“基本排序算法C语言实现”提供了一系列经典的排序算法的C语言实现,帮助开发者深入理解这些算法的工作原理并能实际运用到项目中。 1. **冒泡排序**: 冒泡排序是一种简单的排序算法,它重复地遍历要排序的...

    基本排序算法综合实验.doc

    本实验旨在通过实践操作,帮助学生深入理解并比较各种基本排序算法的性能和特点。 【排序算法种类】 1. 直接插入排序:直接插入排序是一种简单的排序方法,分为有监视哨和无监视哨两种。监视哨用于避免不必要的...

    基本排序算法比较

    几种基本排序算法的运行时间比较 /* *Copyright dongbo *All rights reserved. * *文件名称: 基本排序实现 *功 要: 实现 直接插入排序;简单排序 ;冒泡排序 ;快速排序 及所用时间比较 * *当前版本: 1.0 */

    MFC 基于C++语言的三种基本排序算法的动态演示

    本教程“MFC基于C++语言的三种基本排序算法的动态演示”着重介绍了如何在MFC环境下实现并可视化三种经典的排序算法:冒泡排序、插入排序和选择排序。 **冒泡排序**是一种简单的排序算法,通过重复遍历待排序的序列...

    基本排序算法

    这里我们将深入探讨标题所提及的基本排序算法,以及描述中提到的包含实现源码的资源。 1. 冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序算法,通过重复遍历待排序的序列,比较相邻元素并根据需要交换它们的...

    sorting_algorithms_py, 在 python 中,基本排序算法 简单.zip

    sorting_algorithms_py, 在 python 中,基本排序算法 简单 sorting_algorithms_py用 python 编写的基本排序算法。 代码简单易于理解。平均复杂度 !查看常见排序算法的平均 Big-O 复杂度:快速排序:O ( n log(n) )...

    包括_基础数据结构leetcode基本搜索算法基本排序算法Java8_stream_java_basic.zip

    包括_基础数据结构leetcode基本搜索算法基本排序算法Java8_stream_java_basic

    基本排序算法实现(冒泡,插入排序,快排,希尔排序,堆排序,计数排序,等等)_SortCode.zip

    基本排序算法实现(冒泡,插入排序,快排,希尔排序,堆排序,计数排序,等等)_SortCode

    各种基本排序算法思路介绍.pdf

    本文主要介绍了四种基本的排序算法:冒泡排序、简单选择排序、插入排序以及希尔排序。 1. 冒泡排序: 冒泡排序是一种简单的排序算法,其核心思想是通过重复遍历待排序的数列,比较相邻的两个元素并根据需要交换它们...

    最新10.1几种基本排序算法的实现.pdf

    最新10.1几种基本排序算法的实现.pdf

    基于 matplotlib 实现的基本排序算法的动态可视化项目源码,通过 pyaudio 增加音效,冒泡、选择、插入、快速等排序

    基于 matplotlib 实现的基本排序算法的动态可视化项目源码,通过 pyaudio 增加音效,冒泡、选择、插入、快速等排序 排序算法 具体排序算法的代码实现见 sortx.py 几乎所有的数据结构与算法相关书籍都对排序方法有...

    C++基本排序算法,教你简单的逻辑排序

    在IT领域,排序算法是计算机科学中的基础概念,尤其在编程语言如C++中,掌握各种排序算法对于提升程序效率至关重要。本篇文章将详细讲解四种排序算法:冒泡排序、插入排序、选择排序以及一种更高级的排序算法。 ...

    算法可视化--数据结构课程设计。目前支持了其中基本排序算法以及迪杰斯特拉算

    算法可视化--数据结构课程设计。目前支持了其中基本排序算法以及迪杰斯特拉算法可视化,欢迎学弟学妹Fo_algorithmVisualize

Global site tag (gtag.js) - Google Analytics