任何人都可以给我一个关于shell排序的例子吗?我是一个在这里必须了解shell排序的新人,但首先我必须找到一个Java shell排序示例。我在Google上找到一个例子,但这太难了。Shell排序Java示例
回答
下面是一个例子:
public static void shellsort(Comparable [ ] a)
{
for(int gap = a.length/2; gap > 0;
gap = gap == 2 ? 1 : (int) (gap/2.2))
for(int i = gap; i < a.length; i++)
{
Comparable tmp = a[ i ];
int j = i;
for(; j >= gap && tmp.compareTo(a[ j - gap ]) < 0; j -= gap)
a[ j ] = a[ j - gap ];
a[ j ] = tmp;
}
}
可能,这的Java代码会帮助你。
public class ShellSort {
private long[] data;
private int len;
public ShellSort(int max) {
data = new long[max];
len = 0;
}
public void insert(long value){
data[len] = value;
len++;
}
public void display() {
System.out.print("Data:");
for (int j = 0; j < len; j++)
System.out.print(data[j] + " ");
System.out.println("");
}
public void shellSort() {
int inner, outer;
long temp;
//find initial value of h
int h = 1;
while (h <= len/3)
h = h * 3 + 1; // (1, 4, 13, 40, 121, ...)
while (h > 0) // decreasing h, until h=1
{
// h-sort the file
for (outer = h; outer < len; outer++) {
temp = data[outer];
inner = outer;
// one subpass (eg 0, 4, 8)
while (inner > h - 1 && data[inner - h] >= temp) {
data[inner] = data[inner - h];
inner -= h;
}
data[inner] = temp;
}
h = (h - 1)/3; // decrease h
}
}
public static void main(String[] args) {
int maxSize = 10;
ShellSort arr = new ShellSort(maxSize);
for (int j = 0; j < maxSize; j++) {
long n = (int) (java.lang.Math.random() * 99);
arr.insert(n);
}
arr.display();
arr.shellSort();
arr.display();
}
}
Shell排序通过比较由几个位置的间隙分开的元件改善了插入排序。
这可以让元素朝着预期的位置“迈出更大的步骤”。对数据进行多次传递的间隙尺寸越来越小。 Shell排序的最后一步是一个普通的插入排序,但到那时,数据的数组被保证几乎排序。
此代码可能会帮助您更好地理解逻辑。
package Sorts;
public class ShellSort extends Sorter{
@Override
public <T extends Comparable<? super T>> void sort(T[] a) {
int h = 1;
while((h*3+1) < a.length)
h = 3*h+1;
while(h > 0){
for(int i = h-1; i < a.length; i++){
T s = a[i];
int j = i;
for(j = i; (j>=h) && (a[j-h].compareTo(s) > 0); j-=h)
a[j] = a[j-h];
a[j] = s;
}
h /= 3;
}
}
}
好的答案。 :-) – 2011-02-03 18:32:47
我认为你需要在循环中以h开头:for(int i = h-1; i
这实际上是Knuth排序。除此之外,我看到的唯一问题是h应该是<= a.length/3的规则未在您的算法中遵循。它实际上应该是h <= Math.ceil(a.length/3),但是似乎没有人能够计算这一点。 – 2013-07-12 15:56:50
经典原语类型的实现:
package math;
import java.util.Arrays;
public class Sorter{
public static void main(String []args){
int[] a = {9,8,7,6,5,4,3,2,1};//plz use sophisticated random number generator
System.out.println(Arrays.toString(a));
System.out.println(Arrays.toString(shellSort(a)));
}
//Performs a shell sort on an array of ints.
public static int[] shellSort(int[] array){
int h = 1;
while (h < array.length) h = 3*h + 1;
while (h > 0){
h = h/3;
for (int k = 0; k < h; k++){
for (int i = h+k; i < array.length; i+=h){
int key = array[i];
int j = i-h;
while (j>=0 && array[j] > key){
array[j+h] = array[j];
j-=h;
}
array[j+h] = key;
//-> invariant: array[0,h,2*h..j] is sorted
}
}
//->invariant: each h-sub-array is sorted
}
return array;
};
}
P.S。:检查this link其他排序算法(它们是在C++中,虽然,容易携带到Java)。
这里,这个代码是非常简单的:
/**
* Shellsort, using Shell’s (poor) increments.
* @param a an array of Comparable items.
*/
public static <T extends Comparable<? super T>>
void shellsort(T [ ] a)
{
int j;
for(int gap = a.length/2; gap > 0; gap /= 2)
{
for(int i = gap; i < a.length; i++)
{
T tmp = a[ i ];
for(j = i; j >= gap && tmp.compareTo(a[ j - gap ]) < 0; j -= gap)
{
a[ j ] = a[ j - gap ];
}
a[ j ] = tmp;
}
}
}
我偷了它从一个叫Data Structures and Algorithm Analysis in Java.的书,它是很好的书很容易理解。我建议你阅读它。
这里是壳排序为一个Python实现可视化:
def exch(a,i,j):
t = a[i]
a[i] = a[j]
a[j] = t
def shellsort(string):
print string
a = list(string)
N = len(a)
h = 1
i = 0
j = 0
k = 0
#determine starting stride length
while (h < N/3):
h = 3*h + 1
print "STRIDE LENGTH: " + str(h)
while (h >=1):
i = h
while i < N:
j = i
k = j - h
while j >= h and a[j] < a[j-h]:
k = j - h
exch(a,j,k)
j -= h
i += 1
h = h/3
print "STRIDE LENGTH: " + str(h)
print ''.join(a)·
if __name__ == '__main__':
shellsort("astringtosortwithshellsort")
package sort_tester;
public class ShellSorter extends Sorter {
private final int[] gapArray = {1750,701,301,132,57,23,10,4,1};
@Override
public void makeSort (boolean trace) {
int size = list.length;
int i,j, temp;
for (int gap : gapArray) {
i = gap;
while (i < size) {
temp = list[i];
j = i-gap;
while (j >= 0 && list[j] > temp) {
list[j + gap] = list[j];
j -= gap;
}
list[j + gap] = temp;
i ++;
}
}
}
}
列表 - 为int [];从马尔钦Ciura的arcticle采取 http://sun.aei.polsl.pl/~mciura/publikacje/shellsort.pdf
我找到了解希尔排序的最简单的方法 GapArray是把它分解成段:
private static void shellsort() {
int[] theArray = {44,5,33,22,765,43,53,12,57,97};
//first section gets the Knuth's interval sequence (very efficient)
int h=1;
while(h<= theArray.length/3){
h = 3*h + 1; //h is equal to highest sequence of h<=length/3 (1,4,13,40...)
}
//next section
while(h>0){ //for array of length 10, h=4
//similar to insertion sort below
for(int i=0; i<theArray.length; i++){
int temp = theArray[i];
int j;
for(j=i; j>h-1 && theArray[j-h] >= temp; j=j-h){
a[j] = a[j-h];
}
a[j] = temp;
}
h = (h-1)/3;
}
}
Output: 5, 12, 22, 33, 43, 44, 53, 57, 97, 765
这里是一个视频链接:https://youtu.be/SCBf7aqKQEY 这家伙已经取得一个很好的视频排序!
和一个简单的代码:
int sort(int arr[])
{
int n = arr.length;
int gap = n/2;
int i,j;
while(gap>0)
{ for (i=0,j=i+gap; j<n; i++,++j)
{
if(arr[i]>arr[j]) //swap
{ int temp = arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
gap=gap/2;
}
return 0;
}
使用此
public void shellSort(Integer[] arr) {
int interval = arr.length/2;
while (interval != 0) {
for (int i = 0; i < interval; i++) {
for (int p = i + interval; p < arr.length; p += interval) {
int key = arr[p];
int j = p - interval;
while (j >= 0) {
if (key < arr[j]) {
arr[j + interval] = arr[j];
} else
break;
j -= interval;
}
arr[j + interval] = key;
}
}
interval /= 2;
}
}
- 1. CuSolverRf示例排序错误
- 2. 在Python中反向排序Shell排序
- 3. 示例java应用程序
- 4. Doc Shell交换示例
- 5. shell排序最快的间隔序列?
- 6. java RMID示例
- 7. Java BitSet示例
- 8. SSHD Java示例
- 9. Java排序程序
- 10. 高级Java应用程序示例
- 11. Collections排序Java
- 12. 排序在Java
- 13. 排序在Java
- 14. 排序在Java
- 15. mongo shell/windows XP的简单示例
- 16. ClassLoader的Java示例
- 17. Java扩展示例
- 18. Java GAE DeferredTask示例?
- 19. 野牛Java示例
- 20. JQuery UI排序显示排序顺序
- 21. Linux shell中的排序和uniq
- 22. 试图了解一个shell排序
- 23. Shell排序算法没有完成
- 24. 的Linux的bash shell脚本排序线
- 25. 在Unix Shell脚本中排序输入
- 26. Unix - 在shell脚本中排序
- 27. Shell行命令排序命令
- 28. 快速排序(JAVA)
- 29. Java - 排序分组
- 30. Java:排序数据
感谢老总。但即时通讯仍然新手n不明白要学这个java – Nightstalker 2011-01-30 11:38:24