/**
* 定义数字排序的接口
*
*/
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++的排序类提供了多种排序算法的实现,每个都有其特定的性能特征和适用场景。理解并掌握这些排序算法有助于提升编程能力,优化程序性能。对于初学者,通过阅读和分析这些类的源代码,可以加深对排序算法的...
这个“ListCtrl控件排序类及演示程序”是针对开发者的一个资源,它提供了一种方法来实现ListView控件中数据的动态排序功能,特别适用于那些需要频繁更新和排序列表的应用。 ListCtrl控件排序类是程序中一个关键的...
总的来说,这个C++排序类的实现涵盖了基础到高级的排序算法,为学习者提供了一个实践平台,通过实际编写和运行代码,可以加深对排序算法的理解,提升编程能力。无论你是C++新手还是对算法感兴趣的开发者,都可以从中...
2. **排序类**:排序类是这个项目的核心,它实现了各种排序算法。常见的排序算法有冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等。每个算法都有其独特的比较、交换和探测逻辑。例如,快速排序通常...
标题所提及的“封装好的CListCtrl排序类”是为了方便开发者实现对CListCtrl中的数据进行动态排序,无论是宽字符(Unicode)还是窄字符(ANSI)环境,都能适应。 在描述中提到的“对CListCtrl排序”,意味着这个类...
4.2.1设计一个由自动测试排序算法性能(比较次数compare_count、交换次数exchange_count、探测次数probe_count)的测试类和排序类构成的类体系。 要求:用一个类来描述一个排序算法,类中的sort方法通过调用比较、...
标题 "Clistctrl的一个排序类" 指的是一个专门为`CListCtrl`实现的排序功能的类,这通常涉及到自定义排序逻辑和数据管理。 描述中的 "关于列表的一个很好的排序类,要用到itemdata" 提到了`itemdata`,它是指`...
javascript 实现排序分类功能, 冒泡排序, 快速排序等等
本文将详细探讨"yuandaima.zip_排序算法比较_排序类"中涉及的各种排序算法,包括它们的基本原理、性能分析以及适用场景。 一、冒泡排序(Bubble Sort) 冒泡排序是最基础的排序算法之一,它通过不断地交换相邻的...
排序类通常指的是编程语言中用于实现各种排序算法的类或者模块。这些类提供了方便的方法来对一组数据进行升序或降序排列,使得数据更加有序,便于后续的分析和处理。 标题“排序类.zip”暗示了这个压缩包可能包含了...
### flex DataGrid中文字符排序类解析 在Flex开发过程中,数据展示与管理是十分重要的环节。其中DataGrid作为展示表格数据的重要组件之一,在处理多语言环境尤其是中文字符时,经常面临排序难题。本文将深入分析一...
//排序类 提供int排序的静态方法 有以下排序: 快速排序 堆排序 计数排序 桶排序 归并排序
《LINQ查询:聚会类、排序类、分区类与集合类详解》 LINQ(Language Integrated Query,语言集成查询)是.NET Framework中的一个重要特性,它为C#和Visual Basic等编程语言提供了统一的查询语法,使得对数据的操作...
本文主要聚焦于无领导小组讨论中的排序类问题,通过对其概念、测评要素、分类及其应对策略的详细解析,帮助考生更好地理解和掌握这一题型。 ### 一、题型剖析 #### (一) 排序类问题的概念 排序类问题是无领导小组...
在某些情况下,我们需要对`CListCtrl`中的数据进行排序,这时就需要使用到所谓的“排序类CListCtrl”。这个概念是指通过扩展`CListCtrl`类来实现自定义排序功能的类。 `CListCtrl`默认并不支持动态排序,但可以通过...
基于C++ 的一个排序类 个人总结 适合初步入门数据结构的同学
在C++中实现快速排序类的代码可能如下: ```cpp class QuickSort { private: int* arr; int length; public: QuickSort(int* _arr, int _length) : arr(_arr), length(_length) {} void quickSort(int left, ...
本文将深入探讨如何实现一个仿Zaker首页的拖动排序类,该类能够提供类似表格视图(TableView)的用户体验,同时集成在滚动视图(ScrollView)中。我们将讲解其核心原理、实现方法以及相关的技术点。 首先,标题中的...
这里提到的“结构排序类”很可能是指用户自定义的数据结构,通过STL的排序算法来实现排序功能。 1. 容器:STL提供了多种容器,如vector、list、deque、set、map等,它们用于存储和管理数据。容器中的元素可以是任何...
JAVA SortList 通用排序类 从网上搜到一个java 对 List 排序的工具,自己改了下 支持 整数 和 浮点数 比较后排序,浮点数小数部分的有点问题,期待大牛帮忙优化。