排序算法_JavaPython_数据结构与算法
2011-03-07 20:59
429 查看
常见的排序算法有选择排序,冒泡排序,快速排序,归并排序,Hash排序等,这里面就快速排序,归并排序和堆排序进行讨论。其中堆排序是各大热门公司机试的热门题目。最近在学习python,我原来是喜欢java的,用过一段时间的perl,感觉perl实在是太晦涩了,高度利用了语言符号。Python代码可读性很强,如同一篇洋洋洒洒的散文。废话不多说,直接上代码供大家参考。
Java代码:
package chenx.sorting;
public class MergeSort implements Sort {
int[] sortSrc; // 待排序的数字
int[] sortDes; // 排序后的数字集合
private static final int sortNumber = 100;
public static void main(String[] args) {
MergeSort ms = new MergeSort();
ms.beforeSort();
System.out.println("Before Sort:");
ms.printArray(ms.sortSrc);
ms.afterSort();
System.out.println("After Sort:");
ms.printArray(ms.sortDes);
}
public MergeSort() {
sortDes = new int[sortNumber];
}
private int[] mergeSort(int[] array, int start, int end) {
int[] result = new int[end - start + 1];
if (start < end) {
int mid = (start + end) / 2;
int[] left = mergeSort(array, start, mid);
int[] right = mergeSort(array, mid + 1, end);
result = merge(left, right);
} else if (start == end) {
result[0] = array[start];
return result;
}
return result;
}
private int[] merge(int[] left, int[] right) {
int[] result = new int[left.length + right.length];
int i = 0;
int j = 0;
int k = 0;
while (i < left.length && j < right.length) {
if (left[i] < right[j]) {
result[k++] = left[i++];
} else {
result[k++] = right[j++];
}
}
while (i < left.length) {
result[k++] = left[i++];
}
while (j < right.length) {
result[k++] = right[j++];
}
return result;
}
@Override
public int[] afterSort() {
// TODO Auto-generated method stub
System.arraycopy(mergeSort(sortSrc, 0, sortNumber - 1), 0, sortDes, 0,
sortNumber);
return sortDes;
}
@Override
public int[] beforeSort() {
// TODO Auto-generated method stub
setSortNumbers();
return sortSrc;
}
public int[] setSortNumbers() {
System.out.printf("This will genertate %d for sorted:\n", sortNumber);
sortSrc = new int[sortNumber]; // 100个数字
for (int i = 0; i < sortNumber; i++) {
sortSrc[i] = (int) (Math.random() * sortNumber + 1);
}
return sortSrc;
}
public void printArray(int[] array) {
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
if ((i + 1) % 10 == 0)
System.out.println();
}
}
}
Python代码:
1.归并排序。
归并排序,稳定的排序算法。下面给出Java代码和Python代码(ChenxofHit@gmail.com):Java代码:
package chenx.sorting;
public class MergeSort implements Sort {
int[] sortSrc; // 待排序的数字
int[] sortDes; // 排序后的数字集合
private static final int sortNumber = 100;
public static void main(String[] args) {
MergeSort ms = new MergeSort();
ms.beforeSort();
System.out.println("Before Sort:");
ms.printArray(ms.sortSrc);
ms.afterSort();
System.out.println("After Sort:");
ms.printArray(ms.sortDes);
}
public MergeSort() {
sortDes = new int[sortNumber];
}
private int[] mergeSort(int[] array, int start, int end) {
int[] result = new int[end - start + 1];
if (start < end) {
int mid = (start + end) / 2;
int[] left = mergeSort(array, start, mid);
int[] right = mergeSort(array, mid + 1, end);
result = merge(left, right);
} else if (start == end) {
result[0] = array[start];
return result;
}
return result;
}
private int[] merge(int[] left, int[] right) {
int[] result = new int[left.length + right.length];
int i = 0;
int j = 0;
int k = 0;
while (i < left.length && j < right.length) {
if (left[i] < right[j]) {
result[k++] = left[i++];
} else {
result[k++] = right[j++];
}
}
while (i < left.length) {
result[k++] = left[i++];
}
while (j < right.length) {
result[k++] = right[j++];
}
return result;
}
@Override
public int[] afterSort() {
// TODO Auto-generated method stub
System.arraycopy(mergeSort(sortSrc, 0, sortNumber - 1), 0, sortDes, 0,
sortNumber);
return sortDes;
}
@Override
public int[] beforeSort() {
// TODO Auto-generated method stub
setSortNumbers();
return sortSrc;
}
public int[] setSortNumbers() {
System.out.printf("This will genertate %d for sorted:\n", sortNumber);
sortSrc = new int[sortNumber]; // 100个数字
for (int i = 0; i < sortNumber; i++) {
sortSrc[i] = (int) (Math.random() * sortNumber + 1);
}
return sortSrc;
}
public void printArray(int[] array) {
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
if ((i + 1) % 10 == 0)
System.out.println();
}
}
}
Python代码:
def merge_sort(data): if (len(data)<=1): return data index = len(data)//2 lst1 = data[:index] lst2 = data[index:] left = merge_sort(lst1) right = merge_sort(lst2) return merge(left, right) def merge(lst1, lst2): """to Merge two list together""" list = [] while(len(lst1)>0 and len(lst2)>0): data1 = lst1[0] data2 = lst2[0] if (data1<=data2): list.append(lst1.pop(0)) else: list.append(lst2.pop(0)) if(len(lst1)>0): list.extend(lst1) else: list.extend(lst2) return list arr = [ 2, 7, 4, 5, 6, 7, 9, 10, 12, 1, 3] print (merge_sort(arr))
2.快速排序
Python代码(ChenxofHit@gmail.com):import random def quick_sort(data): if (len(data) <1): return data great=[] less = [] # to get the privot privot = data.pop(random.randint(0, len(data) - 1 )) for item in data: if (item< privot): less.append(item) else: great.append(item) return quick_sort(less)+[privot]+quick_sort(great) arr = [ 2, 7, 4, 5, 6, 7, 9, 10] print (quick_sort(arr)) 代码相当简洁明了!
3.堆排序
#ChenxofHit@gmail.com2011年3月7日21:02:13 def heap_sort (data): result = [] lenData = len(data) while(len(result) < lenData ): heap_adjust(data, result) return result def heap_adjust(data, result): i = len(data) -1 while (i >=1): if( data[(i+1)//2 - 1 ] <= data[ i ]): #the parent node is smaller than the child ,swap it t = data[(i+1)//2 - 1 ] data[(i+1)//2 - 1 ] = data[ i ] data[ i ] = t i = i - 1 result.append(data.pop(0)) arr = [ 2, 7, 4, 5, 6, 7, 9, 10, 12, 1, 3] print (heap_sort(arr))
相关文章推荐
- 排序算法实现与总结Python/Java
- 八大排序算法 Java、Python、C++实现 -- 冒泡排序
- Python cookbook(数据结构与算法)通过公共键对字典列表排序算法示例
- 各种排序算法python和java实现(一)
- Java数据结构与算法之常见排序算法总结
- 各种排序算法python和java实现(二)
- 排序算法——简单选择排序(Python&Java)
- 数据结构与算法Java版——九大基本排序算法(2)
- 用Python 和 Java 写的Sunday字符串排序算法
- 排序算法——冒泡排序(Java&Python)
- 八种排序算法 Java、Python、C++实现 -- 插入排序
- 算法基础——十种常用排序算法的Java及Python实现
- java掉用python
- 总结:python关于一些基本排序算法的实现
- 【转】常见排序算法分析及java实现
- Python排序算法的实现
- 各种排序算法的实现Java
- 详解直接插入排序算法与相关的Java版代码实现
- Java常用的八种排序算法与代码实现
- python数据结构与算法 1 基本数据结构