1.三数取中(也可以5个数甚至更多)
#include<stdio.h>
#define Max 100 //储存的最大值
void Swap(int *A,int *B) {
int temp = *A;
*A = *B;
*B = temp;
}
int NumberOfThree(int arr[], int head, int end)
{
int mid = head + ((end - head) / 2);
if (arr[mid] > arr[end])
{
Swap(&arr[mid], &arr[end]);
}
if (arr[head] > arr[end])
{
Swap(&arr[head], &arr[end]);
}
if (arr[mid] > arr[head])
{
Swap(&arr[mid], &arr[head]);
}
//此时,arr[mid] <= arr[head] <= arr[end]
return arr[head];
}
int Sort(int A[], int head, int end) {
int Standard = NumberOfThree(A, head, end); //标准值为最左边的数
while (head < end) {
while (A[end] >= Standard && head < end)
end--;
A[head] = A[end];
while (A[head] <= Standard && head < end)
head++;
A[end] = A[head];
}
A[head] = Standard;
return end;
}
void Circle(int A[], int head, int end) {
if (head < end) {
int temp;
temp = Sort(A, head, end);
Circle(A, head, temp - 1);
Circle(A, temp + 1, end);
}
}
void Print(int A[], int n) {
for (int i = 0; i < n; i++)
printf("%d\t", A[i]);
}
int main() {
int n, A[Max];
printf("请输入n:\n");
scanf_s("%d", &n);
for (int i = 0; i < n; i++)
scanf_s("%d", A + i);
Circle(A, 0, n - 1);
Print(A, n);
}
2.随机数产生(代码与上类似,只不过标准的取值使用随机数函数)
3.序列长度达到一定大小时,使用插入排序
i.由《数据结构与算法分析》(Mark Allen Weiness所著)可知,当待排序列长度为5~20之间,此时使用插入排序能避免一些有害的退化情形。
ii.插入排序
void insertion_sort(int arr[], int len){
int i,j,key;
for (i=1;i<len;i++){
key = arr[i];
j=i-1;
while((j>=0) && (arr[j]>key)) {
arr[j+1] = arr[j];
j--;
}
arr[j+1] = key;
}
}
iii.完整代码
#include<stdio.h>
#define Max 100 //储存的最大值
void InsertSort(int A[], int n) {
for (int i = 1; i < n; i++) {
int key = A[i];
int j = i - 1;
while (j >= 0 && A[j] > key)
{
A[j + 1] = A[j];
j--;
}
A[j + 1] = key;
}
}
void Swap(int *A,int *B) {
int temp = *A;
*A = *B;
*B = temp;
}
int NumberOfThree(int arr[], int head, int end)
{
int mid = head + ((end - head) / 2);
if (arr[mid] > arr[end])
{
Swap(&arr[mid], &arr[end]);
}
if (arr[head] > arr[end])
{
Swap(&arr[head], &arr[end]);
}
if (arr[mid] > arr[head])
{
Swap(&arr[mid], &arr[head]);
}
//此时,arr[mid] <= arr[head] <= arr[end]
return arr[head];
}
int Sort(int A[], int head, int end) {
int Standard = NumberOfThree(A, head, end); //标准值为最左边的数
while (head < end) {
while (A[end] >= Standard && head < end)
end--;
A[head] = A[end];
while (A[head] <= Standard && head < end)
head++;
A[end] = A[head];
}
A[head] = Standard;
return end;
}
void Circle(int A[], int head, int end) {
if (end - head + 1 < 10)
InsertSort(A, end - head + 1);
else {
if (head < end) {
int temp;
temp = Sort(A, head, end);
Circle(A, head, temp - 1);
Circle(A, temp + 1, end);
}
}
}
void Print(int A[], int n) {
for (int i = 0; i < n; i++)
printf("%d\t", A[i]);
}
int main() {
int n, A[Max];
printf("请输入n:\n");
scanf_s("%d", &n);
for (int i = 0; i < n; i++)
scanf_s("%d", A + i);
Circle(A, 0, n - 1);
Print(A, n);
}