關鍵詞:插入冒泡選擇、希爾歸併快排、堆排序
倒着講
1.堆排序
1.1有關堆與優先隊列,看這裏堆與優先隊列
1.2堆排序的思想:
最大堆,每次把根從堆中取出來刪去,然後從新建堆,並把取出來的元素放到數組的最後
那麼最大的元素被放到n-1的位置,第二大的元素被放到n-2的位置。。。直到最後,數組就變成的由小到大的順序
1.3算法複雜度
最好最差平均都是O(nlogn)
1.4核心代碼
void heapsort(int A[], int n)
{
int maxval;
Heap H(A, n, n);
for (int i = 0; i < n; i++)
maxval = H.removefirst();
}
2.快速排序
int findPivot(int A[], int i, int j)
{
return (i + j) / 2;
}
int partition(int A[], int l, int r, int p)
{
do {
while (A[++l] < p);
while (l<r&&A[--r]>p);
swap(A, l, r);
} while (l < r);
return l;
}
void qsort(int A[], int i, int j)
{
if (j<=i)return;
int index = findPivot(A, i, j);
swap(A, index, j);
int k = partition(A, i - 1, j, A[j]);
swap(A, k, j);
qsort(A, i, k - 1);
qsort(A, k + 1, j);
}
3.歸併排序
void mergeSort(int A[], int temp[], int left, int right)
{
if (left == right)return;
int mid = (left + right) / 2;
mergeSort(A, temp, left, mid);
mergeSort(A, temp, mid + 1, right);
for (int i = left; i <= right; i++)
temp[i] = A[i];
int i1 = left, i2 = mid + 1;
for (int curr=left;curr<=right;curr++)
{
if (i1 == mid + 1)
A[curr] = temp[i2++];
else if (i2 > right)
A[curr] = temp[i1++];
else if (temp[i1] < temp[i2])
A[curr] = temp[i1++];
else
A[curr] = temp[i2++];
}
}
4.希爾排序
4.1思想://按從小到大排序
void insort(int A[], int n, int incr)
{
for (int i = incr; i < n; i += incr)
for (int j = i; j >= incr && (A[j - incr] > A[j]); j -= incr)
swap(A, j - incr, j);
}
void shellsort(int A[], int n)
{
for (int i = n / 2; i>2; i /= 2)
for (int j = i; j >= 0; j--)
{
insort(&A[j], n - j, i);
}
insort(A, n, 1);
}
5.插入、冒泡、選擇排序
5.1插入排序void bublesort(int A[], int n)
{
for (int i = 0; i < n - 1; i++)
for (int j = i+1; j < n; j++)
if (A[j] < A[i])
swap(A, i, j);
}
5.3選擇
void selectSort(int A[], int n)
{
for (int i = 0; i < n; i++)
{
int min = i;
for (int j = n - 1; j > i; j--)
{
if (A[j] < A[min])
min = j;
}
swap(A, i, min);
}
}