/**
* 排序測試類
* * 排序演算法的分類如下:
* 1.插入排序(直接插入排序、折半插入排序、希爾排序);
* 2.交換排序(冒泡泡排序、快速排序);
* 3.選擇排序(直接選擇排序、堆排序);
* 4.歸併排序;
* 5.基數排序。
* * 關於排序方法的選擇:
* (1)若n較小(如n≤50),可採用直接插入或直接選擇排序。
* 當記錄規模較小時,直接插入排序較好;否則因為直接選擇移動的記錄數少於直接插人,應選直接選擇排序為宜。
* (2)若檔案初始狀態基本有序(指正序),則應選用直接插人、冒泡或隨機的快速排序為宜;
* (3)若n較大,則應採用時間複雜度為o(nlgn)的排序方法:快速排序、堆排序或歸併排序。
* */
public class sorttest
system.out.println("**********原始序列**********");
printarray(array);
return array;
}/**
* 列印陣列中的元素到控制台
* @param source
*/public void printarray(int data)
system.out.println();
}/**
* 交換陣列中指定的兩元素的位置
* @param data
* @param x
* @param y
*/private void swap(int data, int x, int y)
/*** 氣泡排序----交換排序的一種
* 方法:相鄰兩元素進行比較,如有需要則進行交換,每完成一次迴圈就將最大元素排在最後(如從小到大排序),下一次迴圈是將其他的數進行類似操作。
* 效能:比較次數o(n^2),n^2/2;交換次數o(n^2),n^2/4
* * @param data 要排序的陣列
* @param sorttype 排序型別
* @return
*/public void bubblesort(int data, string sorttype) }}
} else if (sorttype.equals("desc")) }}
} else
printarray(data);//輸出氣泡排序後的陣列值
}/**
* 直接選擇排序法----選擇排序的一種
* 方法:每一趟從待排序的資料元素中選出最小(或最大)的乙個元素, 順序放在已排好序的數列的最後,直到全部待排序的資料元素排完。
* 效能:比較次數o(n^2),n^2/2
* 交換次數o(n),n
* 交換次數比氣泡排序少多了,由於交換所需cpu時間比比較所需的cup時間多,所以選擇排序比氣泡排序快。
* 但是n比較大時,比較所需的cpu時間佔主要地位,所以這時的效能和氣泡排序差不太多,但毫無疑問肯定要快些。
* * @param data 要排序的陣列
* @param sorttype 排序型別
* @return
*/public void selectsort(int data, string sorttype)
}//交換在位置data.length-i和index(最大值)兩個數
swap(data, data.length - i, index);
}} else if (sorttype.equals("desc"))
}//交換在位置data.length-i和index(最大值)兩個數
swap(data, data.length - i, index);
}} else
printarray(data);//輸出直接選擇排序後的陣列值
}/**
* 插入排序
* 方法:將乙個記錄插入到已排好序的有序表(有可能是空表)中,從而得到乙個新的記錄數增1的有序表。
* 效能:比較次數o(n^2),n^2/4
* 複製次數o(n),n^2/4
* 比較次數是前兩者的一般,而複製所需的cpu時間較交換少,所以效能上比氣泡排序提高一倍多,而比選擇排序也要快。
** @param data 要排序的陣列
* @param sorttype 排序型別
*/public void insertsort(int data, string sorttype) }}
} else if (sorttype.equals("desc")) }}
} else
printarray(data);//輸出插入排序後的陣列值
}/**
* 反轉陣列的方法
* @param data 源陣列
*/public void reverse(int data)
printarray(data);//輸出到轉後陣列的值
}/**
* 快速排序
* 快速排序使用分治法(divide and conquer)策略來把乙個序列(list)分為兩個子串行(sub-lists)。
* 步驟為:
* 1. 從數列中挑出乙個元素,稱為 "基準"(pivot),
* 2. 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分割之後,該基準是它的最後位置。這個稱為分割(partition)操作。
* 3. 遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。
* 遞迴的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞迴下去,但是這個演算法總會結束,因為在每次的迭代(iteration)中,它至少會把乙個元素擺到它最後的位置去。
* @param data 待排序的陣列
* @param low
* @param high
* @see sorttest#qsort(int, int, int)
* @see sorttest#qsort_desc(int, int, int)
*/public void quicksort(int data, string sorttype) else if (sorttype.equals("desc")) else
}/**
* 快速排序的具體實現,排正序
* @param data
* @param low
* @param high
*/private void qsort_asc(int data, int low, int high)
if (i < j)
while (i < j && data < x)
if (i < j)
}data = x;
qsort_asc(data, low, i - 1);
qsort_asc(data, i + 1, high);}}
/*** 快速排序的具體實現,排倒序
* @param data
* @param low
* @param high
*/private void qsort_desc(int data, int low, int high)
if (i < j)
while (i < j && data > x)
if (i < j)
}data = x;
qsort_desc(data, low, i - 1);
qsort_desc(data, i + 1, high);}}
/***二分查詢特定整數在整型陣列中的位置(遞迴)
*查詢線性表必須是有序列表
*@paramdataset
*@paramdata
*@parambeginindex
*@paramendindex
*@returnindex
*/public int binarysearch(int dataset, int data, int beginindex,
int endindex) else if (data > dataset[midindex]) else
}/**
*二分查詢特定整數在整型陣列中的位置(非遞迴)
*查詢線性表必須是有序列表
*@paramdataset
*@paramdata
*@returnindex
*/public int binarysearch(int dataset, int data) else if (data > dataset[midindex]) else
}return -1;
}public static void main(string args)
}
各種排序演算法java實現
插入排序 package org.rut.util.algorithm.support import org.rut.util.algorithm.sortutil author treeroot since 2006 2 2 version 1.0 public class insertsort ...
各種排序演算法java實現
插入排序 package org.rut.util.algorithm.support import org.rut.util.algorithm.sortutil author treeroot since 2006 2 2 version 1.0 public class insertsort ...
各種排序演算法java實現
插入排序 package org.rut.util.algorithm.support import org.rut.util.algorithm.sortutil author treeroot since 2006 2 2 version 1.0 public class insertsort ...