刚捣鼓了一下数据结构和算法 把总结写下,本内容和 my csdn一样http://blog.csdn.net/maomaolingyu
package source.datastruct_algorithm;
import java.util.Random;
public class SortUtil {
static int size =10000;
static VirtualObj[] persion ;
static long[] arr ;
@SuppressWarnings("unchecked")
static synchronized void init(){
persion = new VirtualObj[size];
arr = new long[size];
int[] ran_arr = randomInt();
for(int i=0;i<size;i++){
persion[i] = new VirtualObj("tom"+ran_arr[i],ran_arr[i],ran_arr[i]);
}
for(int i =0;i<size;i++){
arr[i] = ran_arr[i];
}
Proxy.serviceProxy().initLongArr(arr);
Proxy.serviceProxy().initObjArr(persion);
}
private static int[] randomInt(){
Random ran = new Random();
boolean[] bool = new boolean[size];
int rs[] = new int[size];
int temp,j=0;
for(int i=0;i<size;i++){
do{
temp = ran.nextInt(size);
}while(bool[temp]);
bool[temp] =true;
rs[j++]=temp;
}
return rs;
}
public void setBaseArray(long[] array){
arr= array;
size= array.length;
}
public void setObjArray(Object[] arr){
persion = (VirtualObj[])arr;
size= persion.length;
}
public static void bubbleSort(){
Proxy.serviceProxy().baseBubbleSort();
Proxy.serviceProxy().objBubbleSort();
}
public static void selectSort(){
Proxy.serviceProxy().baseSelectSort();
Proxy.serviceProxy().objSelectSort();
}
public static void insertSort(){
Proxy.serviceProxy().baseInsertSort();
Proxy.serviceProxy().objInsertSort();
}
public static void mergeSort(){
Proxy.serviceProxy().baseUnionSort();
Proxy.serviceProxy().objUnionSort();
}
public static void shellSort(){
Proxy.serviceProxy().baseShellSort();
Proxy.serviceProxy().objShellSort();
}
public static void quickSort(){
Proxy.serviceProxy().baseQuickSort();
Proxy.serviceProxy().objQuickSort();
}
public static void main(String[] args) {
init();
System.out.println(System.currentTimeMillis());
bubbleSort();
System.out.println(System.currentTimeMillis());
System.out.println("bubble sort ..............................");
init();
System.out.println(System.currentTimeMillis());
selectSort();
System.out.println(System.currentTimeMillis());
System.out.println("select sort ..............................");
System.out.println(System.currentTimeMillis());
init();
insertSort();
System.out.println(System.currentTimeMillis());
System.out.println("insert sort ..............................");
init();
System.out.println(System.currentTimeMillis());
mergeSort();
System.out.println(System.currentTimeMillis());
System.out.println("merge sort ..............................");
init();
System.out.println(System.currentTimeMillis());
shellSort();
System.out.println(System.currentTimeMillis());
System.out.println("shell sort ..............................");
init();
System.out.println(System.currentTimeMillis());
quickSort();
System.out.println(System.currentTimeMillis());
System.out.println("quick sort ..............................");
}
}
class Proxy{
@SuppressWarnings("rawtypes")
private static SortService service = new SortService();
@SuppressWarnings("rawtypes")
public static SortService serviceProxy(){
return service;
}
}
class SortService<T extends VirtualObj>{
private long[] longArr;
private T[] objArr;
private int size;
public void initLongArr(long[] arr){
longArr = arr;
size = arr.length;
}
public void initObjArr(T[] arr){
objArr = arr;
size = arr.length;
}
public void baseQuickSort(){
baseRecQuicSort(0, size-1);
displayLongArr();
}
//基本类型的快速排序
private void baseRecQuicSort(int left,int right){
if(right - left +1 <=10){
baseInsertSort(left,right);
}else{
long povit = baseGetPivot(left, right);
//long povit = longArr[right];
int compareIndex = basePartition(left,right,povit);
baseRecQuicSort(left,compareIndex);
baseRecQuicSort(compareIndex+1, right);
}
}
//快速排序时的插入排序
private void baseInsertSort(int left,int right){
int j=0;
for(int i=left+1;i<=right;i++){
long temp = longArr[i];
for(j =i;j>left&&longArr[j-1]>temp;j--){
longArr[j]=longArr[j-1];
}
longArr[j] = temp;
}
}
//3项取中,防止数据不随机
private long baseGetPivot(int left,int right){
int center = (left + right)/2;
if(longArr[left] <= longArr[center]){
swap(left, center);
}
if(longArr[left]<= longArr[right]){
swap(left, right);
}
if(longArr[center] > longArr[right]){
swap(center, right);
}
return longArr[right];
}
//快速排序
private int basePartition(int left,int right,long povit){
int leftindex = left;
int rightindex = right-1;
while(true){
while(longArr[++leftindex] < povit);
while((--rightindex)>0&&longArr[rightindex] > povit);
if(leftindex >= rightindex)break;
else{
swap(leftindex, rightindex);
}
}swap(leftindex, right -1);
return leftindex;
}
//交换
private void swap(int indexFrom,int indexTo){
long temp = longArr[indexFrom];
longArr[indexFrom] = longArr[indexTo];
longArr[indexTo] = temp;
}
//对象类型快速排序
public void objQuickSort(){
objRecQuickSort(0,size-1);
displayObjArr();
}
//对象类型快速排序
private void objRecQuickSort(int left,int right){
if(right - left <10){
objInsertSort(left,right);
}
else{
T compareObj = objGetPovit(left,right);
//T compareObj = objArr[right];
int compareIndex = objPartion(left,right,compareObj);
objRecQuickSort(left, compareIndex);
objRecQuickSort(compareIndex+1, right);
}
}
//对象快速排序
private int objPartion(int left,int right,T povit){
int leftindex = left;
int rightindex = right-1;
while(true){
while(objArr[++leftindex].getStr().compareTo(povit.getStr())<0);
while(objArr[--rightindex].getStr().compareTo(povit.getStr())>0);
if(leftindex >= rightindex)break;
else{
swapObj(leftindex, rightindex);
}
}swapObj(leftindex, right-1);
return leftindex;
}
//对象插入排序
private void objInsertSort(int left,int right){
int i=0;
for(int j =left+1;j<size;j++){
T temp = objArr[j];
for(i=j;i>left&&objArr[i-1].getStr().compareTo(temp.getStr())>0;i--){
objArr[i] = objArr[i-1];
}
objArr[i] = temp;
}
}
//3项取中 针对数组不大小不随机
private T objGetPovit(int left,int right){
int center = (right + left)/2;
T t_left = objArr[left];
T t_center = objArr[center];
T t_right = objArr[right];
if(t_left.getStr().compareTo(t_center.getStr()) >0){
swapObj(left,center);
}
if(t_center.getStr().compareTo(t_right.getStr()) <0){
swapObj(center, right);
}
if(t_left.getStr().compareTo(t_right.getStr()) >0){
swapObj(left, right);
}
return objArr[right];
}
//对象交换
private void swapObj(int from,int to){
T temp = objArr[from];
objArr[from] = objArr[to];
objArr[to] = temp;
}
//基本类型希尔排序 增量-3
public void baseShellSort(){
int h=1;
int in,out;
while(h<size/3){
h=h*3+1;
}
while(h>0){
for(out = h;out<size;out++){
long temp = longArr[out];
for(in=out;in > h-1&&longArr[in-h] >= temp;in-=h){
longArr[in] = longArr[in-h];
}
longArr[in] = temp;
}
h=(h-1)/3;
}
displayLongArr();
}
//对象类型希尔排序 增量-3
public void objShellSort(){
int h=1;
int in,out;
while(h<size/3){
h=h*3+1;
}
while(h>0){
for(out = h;out<size;out++){
T temp = objArr[out];
for(in=out;in > h-1&&objArr[in-h].getStr().compareTo(temp.getStr())>0;in-=h){
objArr[in] = objArr[in-h];
}
objArr[in] = temp;
}
h=(h-1)/3;
}
displayObjArr();
}
//基本类型归并排序
public void baseUnionSort(){
long[] workspace = new long[size];
baseMergeSort(workspace,0, workspace.length-1);
displayLongArr();
}
//归并算法
private void baseMergeSort(long[] arr,int lower,int upper){
if(lower == upper)return;
int mid = (upper+lower)/2;
baseMergeSort(arr,lower,mid);
baseMergeSort(arr,mid+1,upper);
baseMerge(arr,lower,mid+1,upper);
}
//归并排序算法
private void baseMerge(long[] arr,int lower,int mid,int upper){
int i=0,middle = mid-1;
int low = lower;
int size = (upper - lower)+1;
while(lower <=middle&&mid<=upper){
if(longArr[lower] < longArr[mid]){
arr[i++] = longArr[lower++];
}
else{
arr[i++] = longArr[mid++];
}
}
while(lower<=middle){
arr[i++] = longArr[lower++];
}
while(mid<=upper){
arr[i++] = longArr[mid++];
}
for(int j=0;j<size;j++){
longArr[low+j] = arr[j];
}
}
//对象类型归并排序 : 当有大量重复时,结果不准确
public void objUnionSort(){
VirtualObj[] t = new VirtualObj[size];
objMergeSort((T[])t,0,size-1);
displayObjArr();
}
//归并算法
private void objMergeSort(T[] arr,int lower,int upper){
if(lower == upper)return;
int mid = (upper+lower)/2;
objMergeSort(arr,lower,mid);
objMergeSort(arr,mid+1,upper);
objMerge(arr,lower,mid+1,upper);
}
//归并排序算法
public void objMerge(T[] arr,int lower,int mid,int upper){
int low = lower;
int i=0;
int size = (upper - lower)/2;
int middle = mid-1;
while(lower <=middle&&mid<=upper){
if(objArr[lower].getStr().compareTo(objArr[mid].getStr())<0){
arr[i++] = objArr[lower++];
}else{
arr[i++] = objArr[mid++];
}
}
while(lower <= middle){
arr[i++] = objArr[lower++];
}
while(mid<=upper){
arr[i++] = objArr[mid++];
}
for(int j=0;j<size;j++){
objArr[low+j] = arr[j];
}
}
//基本类型冒泡排序
public void baseBubbleSort(){
for(int i =size-1; i>1;i--){
for(int j = 0 ; j < i ; j ++){
if(longArr[j] > longArr[j+1]){
long temp;
temp = longArr[j];
longArr[j] = longArr[j+1];
longArr[j+1] = temp;
}
}
}
displayLongArr();
}
//对象类型冒泡排序
public void objBubbleSort(){
T temp;
for(int i =size-1; i>1;i--){
for(int j = 0 ; j < i ; j ++){
if(objArr[j].getStr().compareTo(objArr[j+1].getStr())>0){
temp = objArr[j];
objArr[j] = objArr[j+1];
objArr[j+1] = temp;
}
}
}
displayObjArr();
}
//基本类型插入排序
public void baseInsertSort(){
int j;
for(int i=1;i<size;i++){
long temp = longArr[i];
for(j=i;j>i-1&& longArr[j-1]>temp;j--){
longArr[j]=longArr[j-1];
}
longArr[j]=temp;
}
displayLongArr();
}
//对象类型插入排序
public void objInsertSort(){
int j;
for(int i=1;i<size;i++){
T temp = objArr[i];
for(j=i;j>i-1&& objArr[j-1].getStr().compareTo(temp.getStr())>0;j--){
objArr[j]=objArr[j-1];
}
objArr[j]=temp;
}
displayObjArr();
}
//基本类型选择排序
public void baseSelectSort(){
for(int i=0;i<size;i++){
for(int j=i;j<size;j++){
if(longArr[i]>longArr[j]){
long temp;
temp = longArr[i];
longArr[i] = longArr[j];
longArr[j] = temp;
}
}
}
displayLongArr();
}
//对象类型选择排序
public void objSelectSort(){
T temp;
for(int i=0;i<size;i++){
for(int j=i;j<size;j++){
if(objArr[i].getStr().compareTo(objArr[j].getStr()) > 0){
temp = objArr[i];
objArr[i] = objArr[j];
objArr[j] = temp;
}
}
}
displayObjArr();
}
public void displayLongArr(){
for(int i =0 ;i<size;i++){
System.out.print(longArr[i]+" ");
}System.out.println();
}
public void displayObjArr(){
for(int i =0 ;i<size;i++){
System.out.print(objArr[i].getStr()+" ");
}System.out.println();
}
}
class VirtualObj{
public VirtualObj() {
super();
}
public VirtualObj(String str, int age, float idCard) {
super();
this.str = str;
this.age = age;
this.idCard = idCard;
}
public String getStr() {
return str;
}
public void setName(String str) {
this.str = str;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public float getIdCard() {
return idCard;
}
public void setIdCard(float idCard) {
this.idCard = idCard;
}
private String str;
private int age;
private float idCard;
}
总结 : 在次测试了数组在1000 和10000的情况 看出 冒泡,选择,插入这三个0(N平方)算法 冒泡最慢,插入稍微由于选择.不过大致相当
而归并和希尔表现出色 . 但是快速排序本以为很好的 表现不如前两者,但是有序前面简单派算法。 经过重复和不重复数据的测试,(只是在该环境下的效率大概如此).推荐在数据较多重复情况下优先选择 希尔和归并排序.
希尔和归并 随数据增大效率提高可在10倍N
相关推荐
本资源提供了七大经典排序算法的实现程序,包括快速排序、冒泡排序、选择排序、归并排序、插入排序、希尔排序和堆排序。下面将逐一详细介绍这些排序算法及其原理。 1. 快速排序:由C.A.R. Hoare提出,是一种采用...
排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序.mht
本文将深入探讨Java编程语言中实现的七种主要排序算法:直接插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序以及归并排序。每种算法都有其独特性,适用于不同的场景和数据特性。 1. **直接插入排序**:...
以下是关于"冒泡排序,选择排序,插入排序,希尔排序,堆排序,归并排序,快速排序"这七种常见排序算法的源码实现及相关知识点的详细解释: 1. **冒泡排序**:冒泡排序是一种简单的排序算法,它重复地遍历待排序的...
这七种算法分别是:冒泡排序、选择排序、直接插入排序、希尔排序、堆排序、归并排序和快速排序。 1. **冒泡排序**: 冒泡排序是最基础的排序算法之一,通过重复遍历待排序序列,比较相邻元素并交换位置来实现排序...
printf("\t3: 快速排序\n"); printf("\t4: 直接选择排序\n"); printf("\t5: 堆排序\n"); printf("\t6: 归并排序\n"); printf("\t7: 希尔排序\n"); printf("\t***************************\n"); scanf("%d",&i...
希尔排序的时间复杂度取决于增量序列的选择,通常比简单插入排序更快,但不如其他高效的排序算法(如快速排序、归并排序)。 这些排序算法各有优缺点,选择哪种算法取决于具体的应用场景。例如,对于小规模数据或...
以下是关于"插入排序、选择排序、希尔排序、堆排序、冒泡、双向冒泡、快速排序、归并排序、递归的归并排序、基数排序"这十大经典排序算法的详细解释: 1. 插入排序:插入排序是一种简单的排序算法,它通过构建有序...
各种常用c++排序算法,包括插入排序、冒泡排序、选择排序、快速排序、归并排序、希尔排序等
在计算机科学中,排序算法是数据...归并排序和快速排序则在大多数情况下都能提供较高的效率,尤其是快速排序,是实际应用中非常常用的排序算法。了解并掌握这些排序算法,对于理解算法原理、提高编程能力具有重要意义。
例如,插入排序和选择排序适合小规模数据,冒泡排序简单但效率低,希尔排序对大规模数据有优势,归并排序稳定但需要额外空间,快速排序在大多数情况下高效。在编程实践中,根据具体需求选择合适的排序算法是非常重要...
根据给定的信息,本文将对九种不同的排序算法进行详细解析:选择排序、插入排序、冒泡排序、希尔排序、快速排序、箱子排序(计数排序)、基数排序、归并排序以及堆排序。 ### 一、选择排序 选择排序的基本思想是...
在这份文档中,我用C语言实现了排序算法的多种方法,包括插入排序、选择排序、冒泡排序、希尔排序、归并排序、快速排序、桶排序和基数排序。这些算法可以帮助我们对数据进行有效的排序和整理,以便更好地处理和分析...
10种排序算法代码+综合比较代码(直接插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序、基数排序、折半插入排序、2路插入排序),其中不仅有各种排序算法的代码,还包含10种代码在关键字...
快速排序是效率较高的排序算法,基于“分而治之”的策略。选择一个基准值,将数组分为两部分,一部分所有元素都小于基准,另一部分所有元素都大于基准,然后递归地对这两部分进行快速排序。在Java中,需要编写一个...
- 快速排序由C.A.R. Hoare提出,采用分治策略。选取一个“基准”元素,将数组分为小于基准和大于基准两部分,然后递归地对这两部分进行快速排序。 - C# 中,快速排序的关键在于“分区操作”,通过一次遍历将数组...
各种排序算法的实现函数:包括冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序。 查找最大最小值函数 findMinMax:在给定数组中查找最大值和最小值。 计算平均值...
八种排序算法原理及Java实现是排序算法中的一种,包括冒泡排序、快速排序、直接插入排序、希尔排序、选择排序、归并排序和基数排序等。 冒泡排序是八种排序算法中的一种,属于交换排序。冒泡排序的基本思想是重复...
七种排序算法(包括直接插入排序,折半插入排序,希尔排序,冒泡排序,快速排序,简单选择排序,归并排序) 还有两道题 1./*设计并实现一个有效的对n个整数重排的算法,使得所有负数位于非负数之前,给出算法的性能...
本篇文章将深入探讨标题和描述中提到的九大排序算法:快速排序、冒泡排序、堆排序、希尔排序、直接插入排序、直接选择排序、基数排序、箱排序和桶排序。 1. **快速排序**:快速排序是一种基于分治策略的排序算法,...