老师讲的一些排序算法的总结
# include<stdio.h>
# include<stdlib.h>
# include<string.h>
typedef int KeyType;
typedef int InfoType;
typedef struct {
KeyType key;
InfoType data;
}Node;
void direct_insert_sort_inc(int A[], int n);
void direct_insert_sort_dec(int A[], int n);
void bin_insert_sort_inc(int A[], int n);
void bin_insert_sort_dec(int A[], int n);
void shell_insert_sort_inc(int A[], int n);
void shell_insert_sort_dec(int A[], int n);
void bubble_sort_inc(int A[], int n);
void bubble_sort_dec(int A[], int n);
void quick_sort_inc(int A[], int first, int end);
void quick_sort_dec(int A[], int first, int end);
void easy_select_sort_inc(int A[], int n);
void easy_select_sort_dec(int A[], int n);
void filter(int A[], int low, int high);
void big_heap_sort_inc(int A[], int n);
void merge(int A[], int low, int mid, int high);
void merge_pass(int A[], int length, int n);
void merge_sort(int A[], int n);
int main()
{
int A[] = { 8,9,7,6,2,3,4,1,5 };
merge_sort(A, 9);
return 0;
}
void direct_insert_sort_inc(int A[], int n)
{
for (int i = 1; i < n; i++)
{
int j = i - 1;
for (j = i-1; j >= 0; j--)
{
if (A[i] > A[j]) break;
}
int tmp = A[i];
for (int k = i - 1; k > j; k--) {
A[k + 1] = A[k];
}
A[j + 1] = tmp;
}
}
void direct_insert_sort_dec(int A[], int n)
{
for (int i = 1; i < n; i++)
{
int j = i - 1;
for (j = i - 1; j >= 0; j--)
{
if (A[i] < A[j]) break;
}
int tmp = A[i];
for (int k = i - 1; k > j; k--)
{
A[k + 1] = A[k];
}
A[j + 1] = tmp;
}
}
void bin_insert_sort_inc(int A[], int n)
{
for (int i = 1; i < n; i++)
{
int tmp = A[i];
int first = 0, last = i - 1;
while (first <= last)
{
int mid = (first + last) / 2;
if (A[i] >= A[mid])
{
first = mid + 1;
}
else last = mid - 1;
}
for (int k = i - 1; k >= first; k--) A[k + 1] = A[k];
A[first] = tmp;
}
}
void bin_insert_sort_dec(int A[], int n)
{
for (int i = 1; i < n; i++)
{
int tmp = A[i];
int first = 0, last = i - 1;
while (first <= last)
{
int mid = (first + last) / 2;
if (A[i] <= A[mid]) first = mid + 1;
else last = mid - 1;
}
for (int k = i - 1; k >= first; k--) A[k + 1] = A[k];
A[first] = tmp;
}
}
void shell_insert_sort_inc(int A[], int n)
{
int d = n / 2;
while (d > 0)
{
for (int i = d; i < n; i++)
{
int tmp = A[i];
int j = i - d;
for (j = i - d; i >= 0; j = j - d)
{
if (A[i] > A[j]) break;
}
for (int k = i - d; k > j; k = k - d) A[k + d] = A[k];
A[j + d] = tmp;
}
d = d / 2;
}
}
void shell_insert_sort_dec(int A[], int n)
{
int d = n / 2;
while (d > 0)
{
for (int i = d; i < n; i++)
{
int tmp = A[i];
int j = i - d;
for (j = i - d; j >= 0; j = j - d)
{
if (A[i] < A[j]) break;
}
for (int k = i - d; k > j; k = k - d) A[k + d] = A[k];
A[j + d] = tmp;
}
d = d / 2;
}
}
void bubble_sort_inc(int A[], int n)
{
for (int i = 0; i < n - 1; i++)
{
bool exchange = false;
for (int j = n - 1; j > i; j--)
{
if (A[j] < A[j - 1])
{
int tmp = A[j-1];
A[j-1] = A[j];
A[j] = tmp;
exchange = true;
}
}
if (!exchange) return;
}
}
void bubble_sort_dec(int A[], int n)
{
for (int i = 0; i < n - 1; i++)
{
bool exchange = false;
for (int j = n - 1; j > i; j--)
{
if (A[j] > A[j - 1])
{
int tmp = A[j - 1];
A[j-1] = A[j];
A[j] = tmp;
exchange = true;
}
}
if (!exchange) return;
}
}
void quick_sort_inc(int A[], int first, int end)
{
int i = first, j = end;
if (first < end)
{
int tmp = A[first];
while (i != j)
{
while (j > i && A[j] >= tmp) j--;
A[i] = A[j];
while (j > i && A[i] <= tmp) i++;
A[j] = A[i];
}
A[i] = tmp;
quick_sort_inc(A, first, i - 1);
quick_sort_inc(A, i + 1, end);
}
}
void quick_sort_dec(int A[], int first, int end)
{
int i = first, j = end;
if (first < end)
{
int tmp = A[first];
while (i != j)
{
while (j > i && A[j] <= tmp) j--;
A[i] = A[j];
while (j > i && A[i] >= tmp) i++;
A[j] = A[i];
}
A[i] = tmp;
quick_sort_dec(A, first, i - 1);
quick_sort_dec(A, i + 1, end);
}
}
void easy_select_sort_inc(int A[], int n)
{
for (int i = 0; i < n - 1; i++)
{
int k = i;
for (int j = i; j < n; j++)
{
if (A[j] < A[k]) k = j;
}
if (k != i)
{
int tmp = A[i];
A[i] = A[k];
A[k] = tmp;
}
}
}
void easy_select_sort_dec(int A[], int n)
{
for (int i = 0; i < n - 1; i++)
{
int k = i;
for (int j = i; j < n; j++)
{
if (A[j] > A[k]) k = j;
}
if (k != i)
{
int tmp = A[i];
A[i] = A[k];
A[k] = tmp;
}
}
}
void filter(int A[], int low, int high)
{
int i = low, j = 2 * i;
int tmp = A[i];
while (j <= high)
{
if (A[j] < A[j + 1] && j < high) j++;
if (tmp < A[j])
{
A[i] = A[j];
i = j;
j = 2 * i;
}
else break;
}
A[i] = tmp;
}
void big_heap_sort_inc(int A[], int n)
{
for (int i = n / 2; i >= 0; i--)
{
filter(A, i, n - 1);
}
for (int i = n - 1; i >= 1; i--)
{
int tmp = A[0];
A[0] = A[i];
A[i] = tmp;
filter(A, 0, i - 1);
}
}
void merge(int A[], int low, int mid, int high)
{
int *R = (int *)malloc(sizeof(int)*(high - low + 1));
int i = low, j = mid + 1, k = 0;
while (i <= mid && j <= high)
{
if (A[i] < A[j])
{
R[k] = A[i];
i++;
k++;
}
else
{
R[k] = A[j];
j++;
k++;
}
}
while (i <= mid)
{
R[k] = A[i];
i++;
k++;
}
while (j <= high)
{
R[k] = A[j];
j++;
k++;
}
int t = 0;
for (int s = low; s <= high; s++)
{
A[s] = R[t];
t++;
}
}
void merge_pass(int A[], int length, int n)
{
int i = 0;
for (i = 0; i + 2 * length - 1 < n; i += 2 * length) merge(A, i, i + length - 1, i + 2 * length - 1);
if (i + length - 1 < n) merge(A, i, i + length - 1, n - 1);
}
void merge_sort(int A[], int n)
{
int length = 0;
for (length = 1; length < n; length = 2 * length) merge_pass(A, length, n);
}