排序算法
一, 代价为(n^2)的排序算法:
1,插入排序:
template<typename E>
void swap(E A[], int first, int second) {
E temp = A[first];
A[first] = A[second];
A[second] = temp;
}
template<typename E>
bool prior(E a, E b) {
if (a < b)
return true;
else
return false;
}
template <typename E>
void inssort(E A[], int n) {
for (int i = 0; i < n; i++)
for (int j = i; (j>0) && prior(A[j], A[j - 1]); j--)
swap(A, j, j - 1);
}
2,冒泡排序:
template <typename E>
void bubsort(E A[], int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = n - 1; j > i; j--) {
if (prior(A[j], A[j - 1]))
swap(A, j, j - 1);
}
}
}
3,选择排序:
template<typename E>
void selsort(E A[], int n) {
for (int i = 0; i < n - 1; i++) {
int lowindex = i;
for (int j = n - 1; j > i; j--)
if (prior(A[j], A[lowindex]))
lowindex = j;
swap(A, i, lowindex);
}
}
4,Shell排序:
template<typename E>
void inssort2(E A[], int n, int incr) {
for (int i = incr; i < n; i += incr)
for (int j = i; (j >= incr) && (prior(A[j], A[j - incr])); j -= incr)
swap(A, j, j - incr);
}
template<typename E>
void shellsort(E A[], int n) {
for (int i = n / 2; i > 2; i /= 2)
for (int j = 0; j < i; j++)
inssort2<E>(&A[j], n - j, i);
inssort2<E>(A, n, 1);
}
5,归并排序:
template<typename E>
void mergesort(E A[], E temp[], int left, int right) {
if (left == right) return;
int mid = (left + right) / 2;
mergesort<E>(A, temp, left, mid);
mergessort<E>(A, temp, mid + 1, right);
for (int i = i = left; i <= right; i++)
temp[i] = A[i];
int i1 = left;
int 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 (prior(temp[i1], temp[i2]))
A[curr] = temp[i1++];
else A[curr] = temp[i2++];
}
}
6,快速排序:
这里写代码片