插入排序
(教材上現拍的)左邊框框中是有序表,右邊是無序的,將右邊無序的元素挨個往左邊插入,我畫了兩張圖,遇到有序表中比自己大的,右移,直到遇到比自己小的賦值退出循環,否則繼續直到有序表中第一個
public static void insersort(int a[])
{ int n=a. length;
for(i=1; i<=n-1; i++){
x=[i];
for(j=i-1; j>=0; j--){
if(a[j]>x) a[j+1]=a[j];
else break;
}
a[j]=x;
}
}
選擇排序
從無序表第二個元素到最後一個元素,選出最小值,和無序表第一個元素交換
void selectSort (int a[])
{ int n=a length, jmin, amin, t,i, j;
for(i=0; i<n; i++){
amin=a[i]
for(j=i+1;j<n;j++){//從a[i+1:n-1]中選取最小元素
if(a[j]< amin)
min=a[j]; jmin=j;
}
if(amin<a[i]){
//判斷、交換
t=a[i]; a[i]=a[jmin]; a[jmin]=t;
}
}
}
冒泡排序
冒泡排序中數組的左邊是無序表,右邊是有序表,如果是升序,可以理解爲大泡泡往右邊移動,先是a[0]和a[1]比較,如果a[0]大於a[1]則交換,小於就不交換,然後是a[1]和a[2]比較,以此類推,無序表中最大的就會慢慢移到右邊,直到變成有序表的第一個元素,這是第一輪交換,直到全部變成有序表。
假設a={42,55,73,28,48,66,30,65,94,72}
第一輪交換後的結果:42,55,28,48,66,30,65,73,72,94
第二輪交換後的結果:42,28,48,55,30,65,66,72,73,94
第三輪交換後的結果:28,42,48,30,55,65,66,72,73,94
第四輪交換後的結果:28,42,30,48,55,65,66,72,73,94
第五輪交換後的結果:28,30,42,48,55,65,66,72,73.94
public static void bubbleSort(int a[])
{
int i,j, t, n=a.length;
for(i=n-1;i>=1;1--){//表示冒泡排序的輪次
for(j=0;j<i;j++)
//對無序表a[0:i]進行兩兩比較和交換
if(a[j]>a[j+1]){
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
快速排序算法
//快速排序主算法
public static void quikSort(int A[],int l,inthH)
{
if(l<h){
k=divide(A,l,h);//對數組範圍A[l:h]進行劃分,k是基準值所在位置
quikSort(A,l,k-1);//對基準值的左部A[l:k-1]劃分
quikSort(A,k+1,h);//對基準值的右部A[k+1:h]劃分
}
}
簡單來說,先找一個基準值(一般選第一個元素),把所有元素中小於基準值的劃到左邊,大於基準值的劃到右邊,然後重複上面操作劃分基準值左邊的元素和右邊的元素,就這樣遞歸下去
例如:49,38,65,97,76,13,27
第一趟劃分:27,38,13,49,76,97,65
第二趟劃分:13,27,38,49,65,76,97
快速排序的劃分算法如下
private static int divide(int A[],int i,int j){
int pivotkey;
pivotkey=A[i];
while(i<j){
while(i<j && A[j]>=pivotkey) //向前搜索小於pivotkey的值
j--;
A[i]=A[j];
//i++;
while(i<j && A[i]<pivotkey) //向後搜索大於pivotkey的值
i++;
A[j]=A[i];
//j--;
}
A[i]=pivotkey //或者 A[j]=pivotkey;
return i;
}
有一段描述過程的動態圖