思路:選出最小的元素,放在第一個位置,之後在剩下的元素中,選出最小的元素,放在第二個位置.........以此類推,直到完成排序。
package h;
public class MyA
{
static void selectOne(int[] a, int begin)
{
int p = begin; //假設修正法
for(int i=begin+1; i
插入排序
思路:把新元素加到已經有序的隊列中
public class MyA
{
// 第k項插入到前邊的序列中
static void insertOne(int[] a, int k)
{
for(int i=0; i<=k; i++){
if(a[i]>=a[k]){ //找到了插入的位置
int tmp = a[k];
for(int j=k-1; j>=i; j--) a[j+1] = a[j];
a[i] = tmp;
break;
}
}
}
static void show(int[] a)
{
for(int i=0; i
快速排序
思路:以一個元素作為標尺,將數據分成兩塊,一塊是小於標尺元素大小的,另一塊是大於等於標尺元素大小的。之後再進行遞歸,
將剛才分成的兩塊按照之前的方法再次進行快速排序,直到改分區(塊)內沒有需要排序的元素。
package j;
class MyA
{
static void show(int[] a)
{
for(int i=0; ip1; i--){
if(a[i] <= x){
a[p1++] = a[i];
p2 = i;
dr = !dr;
continue L1;
}
}
p2 = p1;
}
else{
for(int i=p1; i= x){
a[p2--] = a[i];
p1 = i;
dr = !dr;
continue L1;
}
}
p1 = p2;
}
}
a[p1] = x;
quickSort(a,begin,p1-1);
quickSort(a,p1+1,end);
}
public static void main(String[] args)
{
int[] a = {15,22,13,9,16,33,15,23,18,4,33,25,14};
show(a);
quickSort(a, 0, a.length-1);
show(a);
}
}
希爾排序
思路:由於原始數據的有序性對排序時間的長短很一定的影響,按一定的步長對數據進行分組,使用插入排序法進行排序。之後不斷的降低步長,直到步長為1。
public class MyA
{
//希爾排序之一趟排序, dk 為步長
static void shellOne(int[] data, int dk)
{
for(int k=0; k= data[k+i*dk]){
int tmp = data[k+i*dk];
for(int p=i-1; p>=j;p--) data[k+(p+1)*dk] = data[k+p*dk];
data[k+j*dk] = tmp;
break;
}
}
}
}
}
static void show(int[] data)
{
for(int i=0; i