排序算法总结 一

以前自己博客里留了一些java代码实现的排序算法代码,很丑陋,现在看不惯了,刚好最近买了一本《算法 第4版》。索性就一边看看这本书,一边改过去代码,顺便练习C++、python。
        所以说,醉翁之意不在酒,《算法》里那些排序算法有什么意思?都是前人留下的东西,后者(现在那些大学生)学这些算法就像古代读书人读四书五经一样。所以我看重的真不是这些个算法。我看重的是编程的练习。
        练习什么?
        1,练习编程语言。为了以后更高逼格地黑C++,得把C++学好。
        2,练习怎样构建可读性更强、更优雅、可扩展性更强的项目。从这个角度讲,完全可以借此来练习重构技术、设计模式。
             例如排序算法,各种排序算法每一个算法一个类的话,就需要用面向对象思想提取其中公用的代码。 再用抽象方法的方式来要求              某些子类必须实现的方法sort。
             另外,要排序就要排序一切可以比较的类,如果只能排序int类型或double类型,那不叫可扩展性,怎样可扩展?那就要泛型的思                想。此外,要排序的实体类要写方法来定义如何比较,java的comparable,C++的操作符重载。
      
        所以第一回合(本章),是先写一个大框架,之后(从第二回合开始)再不断向这个框架里添加各种排序算法,和其它算法。
        最后要声明这是很简单的程序,java用了半个小时,C++用了一天(第一次使用),python用了一个小时(一边写一边查阅python用法)。目的只在于练习和玩耍。

java实现(代码主要参考《算法第4版》,我在其中加入抽象类的基类): 
     
Date.java(Comparable接口用来比较,重写toString是每个实体类必须的,记得华为编程规范要求过):

package cn.data;

/**

* @ClassName: Date

* @Description: 日期

* @author 无名

* @date 2016-6-9 下午1:26:25

* @version 1.0

*/

public class Date implements Comparable<Date>

{

/**天*/

private final int day;

/**月*/

private final int month;

/**年*/

private final int year;

public Date(int d, int m, int y)

{

day = d;

month = m;

year = y;

}

public int compareTo(Date that)

{

if(this.year > that.year)

{

return +1;

}

if(this.year < that.year)

{

return -1;

}

if(this.month > that.month)

{

return +1;

}

if(this.month < that.month)

{

return -1;

}

if(this.day > that.day)

{

return +1;

}

if(this.day < that.day)

{

return -1;

}

return 0;

}

public String toString()

{

return month + "/" + day + "/" + year;

}

}

Base.java(一些必要的排序类方法,抽象方法sort是子类必须实现的):

package cn.sort;

/**

* @ClassName: Base

* @Description: 排序类基类

* @author 无名

* @date 2016-6-9 下午1:06:52

* @version 1.0

*/

public abstract class Base

{

public abstract void sort(Comparable[] arr);

public boolean less(Comparable v, Comparable w)

{

return v.compareTo(w) < 0;

}

public void exch(Comparable[] arr, int i, int j)

{

Comparable t = arr[i];

arr[i] = arr[j];

arr[j] = t;

}

public void printArr(Comparable[] arr)

{

for(int i = 0; i < arr.length - 1; i++)

{

System.out.print(arr[i] + " ");

}

System.out.print(arr[arr.length - 1]);

}

}

Selection.java:

package cn.sort;

/**

* @ClassName: Selection

* @Description: 选择排序类

* @author 无名

* @date 2016-6-9 下午7:23:59

* @version 1.0

*/

public class Selection extends Base

{

@Override

public void sort(Comparable[] arr)

{

int arrLength = arr.length;

for (int i = 0; i < arrLength; i++)

{

int min = i;

for(int j = i + 1; j < arrLength; j++)

{

if(less(arr[j], arr[min]))

{

min = j;

}

}

exch(arr, i, min);

}

}

}

AlgorithmTest.java:

package cn.test;

import org.junit.Test;

import cn.data.Date;

import cn.sort.Selection;

/**

* @ClassName: Test

* @Description: 测试类

* @author 无名

* @date 2016-6-9 下午7:26:08

* @version 1.0

*/

public class AlgorithmTest

{

private Date[] getTestData()

{

Date[] dateArr = {new Date(11,3,2001),new Date(11,7,1992),

new Date(10,12,1884),new Date(12,3,2001)};

return dateArr;

}

@Test

public void testSelection()

{

Selection selection = new Selection();

Date[] arr = getTestData();

selection.sort(arr);

selection.printArr(arr);

}

}

C++实现(代码主要参考java实现,重载操作符代替java的comparable接口,另外,使用模板类来实现泛型,使用STL vector容器作为数组,C++的文件不知道该怎么组织,本以为类的实现和声明要分开,结果发现inline成员函数不能分开、模板类的实现不能分开。太搞笑了,那就都放.h文件吧)
代码命名规范,参考这篇名为googleC++命名规范的文章:http://blog.csdn.net/u012333003/article/details/20282277?utm_source=tuicool&utm_medium=referral

entity_class.h(C++没有java的toString()就只好自己写,输出时必须自己调用):

/*************************************************

Copyright:bupt

Author:无名

Date:2010-06-10

Description:实体类

**************************************************/

#ifndef ENTITY_H_

#define ENTITY_H_

#include <string>

using std::string;

class Date

{

private:

int day_;

int month_;

int year_;

public:

Date(int d, int m, int y);

string ToString();

inline bool operator< (const Date &date) const;

inline bool operator> (const Date &date) const;

inline bool operator== (const Date &date) const;

};

Date::Date(int d, int m, int y)

{

this->day_ = d;

this->month_ = m;

this->year_ = y;

}

string Date::ToString()

{

char ch_tmp_arr[10];

string final_str;

_itoa_s(this->year_, ch_tmp_arr, 10);

final_str.append(ch_tmp_arr);

final_str.append("-");

_itoa_s(this->month_, ch_tmp_arr, 10);

final_str.append(ch_tmp_arr);

final_str.append("-");

_itoa_s(this->day_, ch_tmp_arr, 10);

final_str.append(ch_tmp_arr);

return final_str;

}

inline bool Date::operator>(const Date &date) const

{

if (this->year_ > date.year_)

{

return true;

}

if (this->year_ < date.year_)

{

return false;

}

if (this->month_ > date.month_)

{

return true;

}

if (this->month_ < date.month_)

{

return false;

}

if (this->day_ > date.day_)

{

return true;

}

if (this->day_ < date.day_)

{

return false;

}

return 0;

}

inline bool Date::operator<(const Date &date) const

{

if (this->year_ > date.year_)

{

return false;

}

if (this->year_ < date.year_)

{

return true;

}

if (this->month_ > date.month_)

{

return false;

}

if (this->month_ < date.month_)

{

return true;

}

if (this->day_ > date.day_)

{

return false;

}

if (this->day_ < date.day_)

{

return true;

}

return 0;

}

inline bool Date::operator==(const Date &date) const

{

if (this->year_ == date.year_ && this->month_ == date.month_

&& this->day_ == date.day_)

return true;

return false;

}

#endif

sort_class.h(来看看C++坑爹的蠢乎乎的泛型吧):

/*************************************************

Copyright:bupt

Author:无名

Date:2010-06-10

Description:与排序相关的类

**************************************************/

#ifndef SORT_H_

#define SORT_H_

#include<iostream>

#include<string>

#include<vector>

using std::vector;

using std::cin;

using std::cout;

using std::endl;

template <class T>

class SortBase

{

public:

virtual void Sort(vector<T> & arr) = 0;

void Exch(vector<T> & arr, int i, int j);

void PrintArr(vector<T> & arr);

};

template <class T1, class T2>

class Selection :public SortBase<T1>

{

public:

void Sort(vector<T2> & arr);

};

template <class T>

void SortBase<T>::Exch(vector<T> & arr, int i, int j)

{

T t = arr[i];

arr[i] = arr[j];

arr[j] = t;

}

template <class T>

void SortBase<T>::PrintArr(vector<T> & arr)

{

int length = arr.size();

for (int i = 0; i < length - 1; i++)

{

cout << arr[i].ToString() << " ";

}

cout << arr[length - 1].ToString() << endl;

}

template <class T1, class T2>

void Selection<T1, T2>::Sort(vector<T2> & arr)

{

int arr_length = arr.size();

for (int i = 0; i < arr_length; i++)

{

int min = i;

for (int j = i + 1; j < arr_length; j++)

{

if (arr[j] < arr[min])

{

min = j;

}

}

Exch(arr, i, min);

}

}

#endif

algorithm_test.cpp:

/*************************************************

Copyright:bupt

Author:无名

Date:2010-06-10

Description:测试

**************************************************/

#include "sort_class.h"

#include "entity_class.h"

vector<Date> getTestData()

{

Date d1 = Date(11, 7, 1992);

Date d2 = Date(3, 2, 2001);

Date d3 = Date(10, 10, 1888);

Date d4 = Date(23, 7, 1992);

vector<Date> vec;

vec.push_back(d1);

vec.push_back(d2);

vec.push_back(d3);

vec.push_back(d4);

return vec;

}

void main()

{

vector<Date> vec = getTestData();

Selection<Date,Date> selection;

selection.Sort(vec);

selection.PrintArr(vec);

cin.get();

}

python实现(代码主要参考java,IDE eclipse,人生苦短,我用python你可以看到这些代码中,python的是最简洁的C++是最丑):


Date.py:

‘‘‘

Created on 2016-6-11

@author: sonn

‘‘‘

class Date:

def __init__(self,year,month,day):

self.__day = day

self.__month = month

self.__year = year

def compareTo(self,that):

if self.__year > that.__year:

return 1

if self.__year < that.__year:

return -1

if self.__month > that.__month:

return 1

if self.__month < that.__month:

return -1

if self.__day > that.__day:

return 1

if self.__day < that.__day:

return -1

return 0

def __repr__(self):

return str(self.__year) + "-" + str(self.__month) + "-" + str(self.__day)

Base.py:

‘‘‘

Created on 2016-6-11

@author: sonn

‘‘‘

from abc import ABCMeta, abstractmethod

class Base:

__metaclass__ = ABCMeta

@abstractmethod

def sort(self):pass

def less(self,v,w):

return v.compareTo(w)

def exch(self,arr,i,j):

tmp = arr[i]

arr[i] = arr[j]

arr[j] = tmp

def printArr(self,arr):

for date in arr:

print(date)

Selection.py:

‘‘‘

Created on 2016-6-11

@author: sonn

‘‘‘

from cn.sort.Base import Base

class Selection(Base):

def sort(self,arr):

arrLen = len(arr)

for i in range(0,arrLen-1):

min = i

for j in range(i + 1, arrLen - 1):

if(self.less(arr[j], arr[min]) < 0):

min = j

self.exch(arr, i, min)

Test.py:

‘‘‘

Created on 2016-6-11

@author: sonn

‘‘‘

from cn.data.Date import Date

from cn.sort.Selection import Selection

def getArrForSortTest():

date1 = Date(1992,7,11)

date2 = Date(2001,7,12)

date3 = Date(1777,6,13)

date4 = Date(2001,7,11)

arr = [date1,date2,date3,date4]

return arr

if __name__ == ‘__main__‘:

arr = getArrForSortTest()

selection = Selection()

selection.sort(arr)

selection.printArr(arr)

时间: 2024-10-12 20:57:06

排序算法总结 一的相关文章

经典排序算法 - 冒泡排序Bubble sort

 原文出自于 http://www.cnblogs.com/kkun/archive/2011/11/23/bubble_sort.html 经典排序算法 - 冒泡排序Bubble sort 原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似看例子 例子为从小到大排序, 原始待排序数组| 6 | 2 | 4 | 1 | 5 | 9 | 第一趟排序(外循环) 第

排序算法比较及其应用

一.将各种数据排序 只要实现了Comparable接口的数据类型就可以被排序. 但要使算法能够灵活地用不同字段进行排序,则是后续需要考虑的问题. 1.指针排序 在Java中,指针操作是隐式的,排序算法操作的总是数据引用,而不是数据本身. 2.键不可变 如果在排序后,用例还可以改变键值,那么数组很可能就不是有序的了.类似,优先队列也会乱套. Java中,可以用不可变数据类型作为键来避免这个问题,如String,Integer,Double和File都是不可变的. 3.廉价交换 使用引用的另一个好处

选择排序 —— 排序算法系列

假设我们有如下一个数组: 使用选择排序算法对这个数组进行排序,步骤如下: 第 1 次 在下标0到6之间找到最小的数字,我们可以发现最小的数字是15,它在下标为4的位置上: 把下标4上面的数字跟下标0上面的数字互换,得到排序如下图的数组: 第 2 次 在下标1到6之间找到最小的数字,我们可以发现最小的数字是33,它在下标为5的位置上: 把下标5上面的数字跟下标1上面的数字互换,得到排序如下图的数组: 第 3 次 在下标2到6之间找到最小的数字,我们可以发现最小的数字是48,它在下标为5的位置上:

排序算法Java版,以及各自的复杂度,以及由堆排序产生的top K问题

常用的排序算法包括: 冒泡排序:每次在无序队列里将相邻两个数依次进行比较,将小数调换到前面, 逐次比较,直至将最大的数移到最后.最将剩下的N-1个数继续比较,将次大数移至倒数第二.依此规律,直至比较结束.时间复杂度:O(n^2) 选择排序:每次在无序队列中"选择"出最大值,放到有序队列的最后,并从无序队列中去除该值(具体实现略有区别).时间复杂度:O(n^2) 直接插入排序:始终定义第一个元素为有序的,将元素逐个插入到有序排列之中,其特点是要不断的 移动数据,空出一个适当的位置,把待插

排序算法总结

各种排序算法总结  排序算法  插入排序 冒泡排序  选择排序  归并排序  快速排序 堆排序  计数排序  基数排序  桶排序  思想  构建有序序列 两两交换 每次找一个最小值 分治法思想 分治法思想 最小堆.最大堆 数字本身的属性  对数据选择多种基数  函数的映射关系.Hash  数据结构  数组  数组  数组  数组 不定   数组 数组 数组  数组  最差时间复杂度 O(n^2)   O(n^2)   O(n^2)   O(n*lgn)  O(n^2).改进O(n*lgn)  O

七大常见排序算法总结

文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 2016.04.06 lutianfei none V1.1 2016.07.16 lutianfei 增加了归并排序说明 V2.0 2016.07.19 lutianfei 完善了排序算法的总结 排序另一种分法 外排序:需要在内外存之间多次交换数据才能进行 内排序: 插入类排序 直接插入排序 希尔排序 选择类排序 简单选择排序 堆排序 交换类排序 冒泡排序 快速排序 归并类排序 归并排序 排序方法 平均情况 最好情况 最坏情况

数据结构——各排序算法的比较

1.从时间复杂度比较  从平均时间复杂度来考虑,直接插入排序.冒泡排序.直接选择排序是三种简单的排序方法,时间复杂度都为O(n2),而快速排序.堆排序.二路归并排序的时间复杂度都为O(nlog2n),希尔排序的复杂度介于这两者之间.若从最好的时间复杂度考虑,则直接插入排序和冒泡排序的时间复杂度最好,为O(n),其它的最好情形同平均情形相同.若从最坏的时间复杂度考虑,则快速排序的为O(n2),直接插入排序.冒泡排序.希尔排序同平均情形相同,但系数大约增加一倍,所以运行速度将降低一半,最坏情形对直接

八种排序算法

最近一段时间自己在研究各种排序算法,于是自己写了一个八种排序算法的集合: /************************************************************************* > Copyright (c)2014 stay hungry,stay foolish !!! > File Name: sort.cpp > Author: kanty > Mail: [email protected] > Created Time:

排序算法 之 快速排序

快速排序是基于分治思想的一种排序算法,就像该方法的名字一样,速度比较快,所以叫做快速排序:它的平均时间复杂度为O(N*logN),最坏时间复杂度为O(n2),由于快速排序在序列元素数量多的时候速度比较快,所以很多语言内置的排序方法也是用快速排序实现的.快速排序也有很多优化的版本,比如在排序时基数的选择等等-下面就说一下一般的快速排序的实现. 基本思想: 快速排序的基本思想就是,先从待排序的序列中任选一个元素作为基数,然后将序列中的其他小于基数的元素放在基数的左边,大于或等于基数的元素放在基数的右

排序算法的JS实现

排序算法是基础算法,虽然关键在于算法的思想而不是语言,但还是决定借助算法可视化工具结合自己常用的语言实现一下 1.冒泡排序 基本思路:依次比较两两相邻的两个数,前面数比后面数小,不变.前面数比后面数大,交换顺序.一轮下来,最后的一个数是最大的数. 外循环每增加一次,内循环减少一次. 图形展示: function bubbleSort(arr){ for (var i = 0; i < arr.length; i++) { for (var j = 0; j< arr.length-i-1; j