`

排序类

    博客分类:
  • J2SE
J# 
阅读更多
/**
 * 定义数字排序的接口
 *
 */
public interface ISortNumber 
{
	/**
	 * 对整型数组按升序排序
	 * @param intArray 待排序的整型数组
	 * @return 按升序排序后的数组
	 */
	public int[] sortASC(int[] intArray);
}

/**
 * 
 * 使用选择排序法对整型数组进行排序
 */
public class SelectionSort implements ISortNumber 
{

	public int[] sortASC(int[] intArray) 
	{
		if(intArray == null)
		{
			return null;
		}
		/*
		 * 因为Java的参数传递是采用引用传值方式,在排序的过程中需要改变
		 * 数组元素的顺序,也就是改变了参数数组,所以,为了保证输入参数
		 * 的值不变,这里就采用了数组的clone方法,直接克隆一个数组
		 */
		
		int[] srcDatas = (int[])intArray.clone();
		int size = srcDatas.length;
		//从头遍历数组
		for(int i=0;i<size;i++)
		{
			//遍历下标威i之后的元素
			for(int j=i;j<size;j++)
			{
				//如果数组前面的值比后面的值大,则交换位置
				if(srcDatas[i]>srcDatas[j])
				{
					swap(srcDatas, i, j);
				}
			}
		}
		return srcDatas;
	}
	
	/**
	 * 交换数组中下标为src和dest的值
	 * @param data 数组
	 * @param src 源下标
	 * @param dest 目标下标
	 */
	private void swap(int[] data,int src,int dest)
	{
		int temp = data[src];
		data[src] = data[dest];
		data[dest] = temp;
	}

}

/**
 * 
 * 冒泡法对整型数组排序
 */
public class BubbleSort implements ISortNumber
{

	public int[] sortASC(int[] intArray) {
		if(intArray==null)
		{
			return null;
		}
		int[] srcDatas = (int[])intArray.clone();
		boolean changedPosition = true;	//标示是否交换了数组中元素位置
		int comparedTimes = 0;	//标示比较次数
		int maxComparedTimes = srcDatas.length-1;	//标示排序过程中最多可能交换的次数
		//如果已经发生的比较次数还没有到达最大次数,而且此前交换过元素位置,则继续
		while((comparedTimes<maxComparedTimes) && (changedPosition))
		{
			for(int i=0;i<(maxComparedTimes-comparedTimes);i++)
			{
				changedPosition=false;
				if(srcDatas[i]>srcDatas[i+1])
				{
					swap(srcDatas, i, i+1);
					changedPosition=true;
				}
			}
			comparedTimes++;
		}
		return srcDatas;
	}

	/**
	 * 交换数组中下标为src和dest的值
	 * @param data 数组
	 * @param src 源下标
	 * @param dest 目标下标
	 */
	private void swap(int[] data,int src,int dest)
	{
		int temp = data[src];
		data[src] = data[dest];
		data[dest] = temp;
	}
}

/**
 * 采用线性插入排序法实现数组排序
 *
 */
public class LinearInsertSort implements ISortNumber
{
	public LinearInsertSort()
	{
		
	}
	public int[] sortASC(int[] intArray) {
		if(intArray==null)
		{
			return null;
		}
		int[] srcDatas = (int[])intArray.clone();
		int size = srcDatas.length;
		int temp = 0;
		int index = 0;
		//假定第一个数字已经排好了顺序,所以i是从1开始而不是从0开始
		for(int i=1;i<size;i++)
		{
			temp = srcDatas[i];
			index = i;
			while((index>0) && (temp<srcDatas[index-1]))
			{
				//移动index后面的数字
				srcDatas[index] = srcDatas[index-1];
				index--;
			}
			srcDatas[index] = temp;
		}
		return srcDatas;
	}

}

/**
 * 采用快速排序法实现数组的排序
 *
 */
public class QuickSort implements ISortNumber
{
	public QuickSort()
	{
		
	}
	public int[] sortASC(int[] intArray) {
		if(intArray ==null)
		{
			return null;
		}
		int[] srcDatas = (int[])intArray.clone();
		return this.quickSort(srcDatas, 0, srcDatas.length-1);
	}
	
	/**
	 * 采用分治递归的方法实现快速排序法
	 * @param srcDatas 待排序的数组
	 * @param first 起始下标
	 * @param last 终止下标
	 * @return 排好序的数组
	 */
	private int[] quickSort(int[] srcDatas,int first,int last)
	{
		if(first<last)
		{
			int pos = partition(srcDatas, first, last);
			quickSort(srcDatas, first, pos-1);
			quickSort(srcDatas, pos+1, last);
		}
		return srcDatas;
	}
	
	/**
	 * 寻找数组的分治点
	 * 根据数组的第一个数分治,把比数组第一个数大的往后排,把比数组第一个数小的往前排
	 * @param srcDatas 待排序的数组
	 * @param first 起始下标
	 * @param last 终止下标
	 * @return 传入数组的第一个数的最终下标
	 */
	private int partition(int[] srcDatas,int first,int last)
	{
		int temp = srcDatas[first];
		int pos = first;
		for(int i=first+1;i<=last;i++)
		{
			if(srcDatas[i]<temp)
			{
				pos++;
				swap(srcDatas, pos, i);
			}
		}
		swap(srcDatas, first, pos);
		return pos;
	}
	
	/**
	 * 交换数组中下标为src和dest的值
	 * @param data
	 * @param src
	 * @param dest
	 */
	private void swap(int[] data,int src,int dest)
	{
		int temp = data[src];
		data[src] = data[dest];
		data[dest] = temp;
	}
}

public class SortTest 
{
	/**
	 * 打印数组
	 * @param intArray
	 */
	public static void printIntArray(int[] intArray)
	{
		if(intArray==null)
		{
			return;
		}
		for(int i=0;i<intArray.length;i++)
		{
			System.out.print(intArray[i] + " ");
		}
		System.out.println();
	}
	
	public static void main(String[] args)
	{
		int[] intArray = new int[]{6,3,4,2,7,2,-3,3};
		
		System.out.print("排序前的数组:");
		printIntArray(intArray);
		ISortNumber test = new SelectionSort();
		System.out.print("选择排序法排序结果:");
		printIntArray(test.sortASC(intArray));
		
		System.out.print("排序前的数组:");
		printIntArray(intArray);
		test = new BubbleSort();
		System.out.print("冒泡排序法排序结果:");
		printIntArray(test.sortASC(intArray));
		
		System.out.print("排序前的数组:");
		printIntArray(intArray);
		test = new LinearInsertSort();
		System.out.print("线性插入排序法排序结果");
		printIntArray(test.sortASC(intArray));
		
		System.out.print("排序前的数组:");
		printIntArray(intArray);
		test = new QuickSort();
		System.out.print("快速排序法排序结果");
		printIntArray(test.sortASC(intArray));
	}
}
分享到:
评论

相关推荐

    C++常见的排序类

    总之,C++的排序类提供了多种排序算法的实现,每个都有其特定的性能特征和适用场景。理解并掌握这些排序算法有助于提升编程能力,优化程序性能。对于初学者,通过阅读和分析这些类的源代码,可以加深对排序算法的...

    ListCtrl控件排序类及演示程序

    这个“ListCtrl控件排序类及演示程序”是针对开发者的一个资源,它提供了一种方法来实现ListView控件中数据的动态排序功能,特别适用于那些需要频繁更新和排序列表的应用。 ListCtrl控件排序类是程序中一个关键的...

    C++实现的排序类,多种排序方法

    总的来说,这个C++排序类的实现涵盖了基础到高级的排序算法,为学习者提供了一个实践平台,通过实际编写和运行代码,可以加深对排序算法的理解,提升编程能力。无论你是C++新手还是对算法感兴趣的开发者,都可以从中...

    java排序测试类,包括了数据类、排序类和测试类

    2. **排序类**:排序类是这个项目的核心,它实现了各种排序算法。常见的排序算法有冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等。每个算法都有其独特的比较、交换和探测逻辑。例如,快速排序通常...

    封装好的CListCtrl排序类

    标题所提及的“封装好的CListCtrl排序类”是为了方便开发者实现对CListCtrl中的数据进行动态排序,无论是宽字符(Unicode)还是窄字符(ANSI)环境,都能适应。 在描述中提到的“对CListCtrl排序”,意味着这个类...

    利用java实现排序类简单排序过程的可视化

    4.2.1设计一个由自动测试排序算法性能(比较次数compare_count、交换次数exchange_count、探测次数probe_count)的测试类和排序类构成的类体系。 要求:用一个类来描述一个排序算法,类中的sort方法通过调用比较、...

    Clistctrl的一个排序类

    标题 "Clistctrl的一个排序类" 指的是一个专门为`CListCtrl`实现的排序功能的类,这通常涉及到自定义排序逻辑和数据管理。 描述中的 "关于列表的一个很好的排序类,要用到itemdata" 提到了`itemdata`,它是指`...

    javascript 实现排序分类功能

    javascript 实现排序分类功能, 冒泡排序, 快速排序等等

    yuandaima.zip_排序算法比较_排序类

    本文将详细探讨"yuandaima.zip_排序算法比较_排序类"中涉及的各种排序算法,包括它们的基本原理、性能分析以及适用场景。 一、冒泡排序(Bubble Sort) 冒泡排序是最基础的排序算法之一,它通过不断地交换相邻的...

    排序类.zip

    排序类通常指的是编程语言中用于实现各种排序算法的类或者模块。这些类提供了方便的方法来对一组数据进行升序或降序排列,使得数据更加有序,便于后续的分析和处理。 标题“排序类.zip”暗示了这个压缩包可能包含了...

    flex DataGrid中文字符排序类

    ### flex DataGrid中文字符排序类解析 在Flex开发过程中,数据展示与管理是十分重要的环节。其中DataGrid作为展示表格数据的重要组件之一,在处理多语言环境尤其是中文字符时,经常面临排序难题。本文将深入分析一...

    Java写的排序类(快速排序 堆排序 计数排序 桶排序 归并排序)

    //排序类 提供int排序的静态方法 有以下排序: 快速排序 堆排序 计数排序 桶排序 归并排序

    ch04-linq查询之聚会类,排序类,分区类,集合类等.rar

    《LINQ查询:聚会类、排序类、分区类与集合类详解》 LINQ(Language Integrated Query,语言集成查询)是.NET Framework中的一个重要特性,它为C#和Visual Basic等编程语言提供了统一的查询语法,使得对数据的操作...

    无领导小组排序类问题精讲.pdf

    本文主要聚焦于无领导小组讨论中的排序类问题,通过对其概念、测评要素、分类及其应对策略的详细解析,帮助考生更好地理解和掌握这一题型。 ### 一、题型剖析 #### (一) 排序类问题的概念 排序类问题是无领导小组...

    排序类CListCtrl

    在某些情况下,我们需要对`CListCtrl`中的数据进行排序,这时就需要使用到所谓的“排序类CListCtrl”。这个概念是指通过扩展`CListCtrl`类来实现自定义排序功能的类。 `CListCtrl`默认并不支持动态排序,但可以通过...

    基于C++的排序类

    基于C++ 的一个排序类 个人总结 适合初步入门数据结构的同学

    C++封装快速排序类,并实现取第k小个数字

    在C++中实现快速排序类的代码可能如下: ```cpp class QuickSort { private: int* arr; int length; public: QuickSort(int* _arr, int _length) : arr(_arr), length(_length) {} void quickSort(int left, ...

    仿Zaker首页的拖动排序类

    本文将深入探讨如何实现一个仿Zaker首页的拖动排序类,该类能够提供类似表格视图(TableView)的用户体验,同时集成在滚动视图(ScrollView)中。我们将讲解其核心原理、实现方法以及相关的技术点。 首先,标题中的...

    STL.rar_stl.cpp_结构排序类

    这里提到的“结构排序类”很可能是指用户自定义的数据结构,通过STL的排序算法来实现排序功能。 1. 容器:STL提供了多种容器,如vector、list、deque、set、map等,它们用于存储和管理数据。容器中的元素可以是任何...

    JAVA SortList 通用排序类

    JAVA SortList 通用排序类 从网上搜到一个java 对 List 排序的工具,自己改了下 支持 整数 和 浮点数 比较后排序,浮点数小数部分的有点问题,期待大牛帮忙优化。

Global site tag (gtag.js) - Google Analytics