冒泡排序
這是一種穩定的排序算法
//簡單排序之冒泡排序
//時間複雜度:最好:原來就是順序的 T = O(N)
// 最壞:原來是逆序的 T = O(N*N)
public int[] BubbleSort(int[] A,int n)
{
int flag = 0;
for (int p = n - 1; p >= 0; p--)
{
flag = 0;
for (int i = 0; i < p; i++)
{
if (A[i] > A[i + 1]) //一趟冒泡
{
A[i] = A[i] + A[i + 1];
A[i + 1] = A[i] - A[i + 1];
A[i] = A[i] - A[i + 1];
flag = 1; //標識發生了交換
}
}
if (flag == 0) //全程無交換
{
break;
}
}
return A;
}
插入排序
這是一種穩定的排序算法
//簡單排序之插入排序
//時間複雜度:最好:原來就是順序的 T = O(N)
// 最壞:原來是逆序的 T = O(N*N)
public int[] InsertionSort(int[] A, int n)
{
int temp = 0;
int i = 0;
for (int p =1; p < n; p++)
{
temp = A[p]; //摸下一張牌
for ( i = p; i > 0 && A[i-1]> temp; i--)
{
A[i] = A[i - 1]; // 移出空位
}
A[i] = temp; // 新牌落位
}
return A;
}
相關概念-逆序對(inversion)
對於下標i<j,,如果i<j,如果A[i]>A[j],則稱(i,j)是一對逆序對(inversion)。
定理:任意N個不同元素組成的序列平均具有N(N-1)/4個逆序對。
定理:任意僅以交換相鄰輛元素來排序的算法,其平均時間複雜度爲O(N*N )。
希爾排序
這是一種穩定的排序算法
public int[] ShellSort(int[] A, int n)//原始希爾排序;每次都是取一半的間距
{
int temp = 0;
int i = 0;
int d = 0;
for (d = n / 2; d > 0; d /=2)
{
for (int p = d; p < n; p++)
{
temp = A[p]; //摸下一張牌
for (i = p; i > d && A[i - d] > temp; i-=d)
{
A[i] = A[i - d]; // 移出空位
}
A[i] = temp; // 新牌落位
}
}
return A;
}