f(T a[], int n){}
你要用哪种排序?
#include
#include
#include
void InsertSort(int L[]) {
// 对顺序表L作直接插入排序
int i,j;
for (i = 2; i <= 100; ++i)
if (L[i] < L[i-1]) {
L[0] = L[i];
for (j = i-1; L[0] < L[j]; --j)
L[j+1] = L[j];
L[j+1] = L[0];
}
} // InsertSort
void BInsertSort(int L[]) {
// 对顺序表L作折半插入排序
int i,j,high,low,m;
for (i = 2; i <= 100; ++i) {
L[0] = L[i];
low = 1; high = i-1;
while (low <= high) {
m = (low+high) / 2;
if (L[0] < L[m]) high = m-1;
else low = m + 1;
}
for (j = i-1; j >= high+1; --j) L[j+1] = L[j];
L[high+1] = L[0];
}
} // BInsertSort
void ShellInsert(int L[], int dk) {
// 对顺序表L作一趟希尔插入排序
int i,j;
for (i = dk+1; i <= 100; ++i)
if (L[i] < L[i-dk]) {
L[0] = L[i];
for (j = i-dk; j>0 && L[0]
L[j+dk] = L[j];
L[j+dk] = L[0];
}
} // ShellInsert
void ShellSort(int L[]) {
// 按增量序列dlta[0..t-1]对顺序表L作希尔排序
int dlta[6] = {50,25,12,6,3,1};
for (int k = 0; k < 6; ++k)
ShellInsert(L, dlta[k]);
} // ShellSort
Partition(int L[], int low, int high) {
// 交换顺序表L中子序列L.r[low..high]的记录,使枢轴记录到位,
// 并返回其所在位置,此时,在它之前(后)的记录均不大(小)于它
L[0] = L[low];
while (low < high) {
while (low < high && L[high] >= L[0]) --high;
L[low] = L[high];
while (low < high && L[low] <= L[0]) ++low;
L[high] = L[low];
}
L[low] = L[0];
return low;
} // Partition
void QSort(int L[], int low, int high) {
// 对顺序表L中的子序列L.r[low..high]进行快速排序
int pivotloc;
if (low < high) {
pivotloc = Partition(L, low, high);
QSort(L, low, pivotloc-1);
QSort(L, pivotloc+1, high);
}
} // QSort
void QuickSort(int L[]) {
// 对顺序表L进行快速排序
QSort(L, 1, 100);
} // QuickSort
void SelectSort(int L[]) {
// 对顺序表L作简单选择排序
int i,j,k;
for (i =1; i < 100; i++) {
k = i;
for (j = i+1; j <= 100; j++)
if (L[j] < L[k]) k=j;
if(k!=j)
{L[0] = L[k]; L[k] = L[i]; L[i] =L[0];}
}
} // SelectSort
void HeapAdjust(int H[], int s, int m) {
// 已知H.r[s..m]中记录的关键字除H.r[s].key之外均满足堆的定义,
// 本函数调整H.r[s]的关键字,使H.r[s..m]成为一个大顶堆
int j,rc;
rc = H[s];
for (j = 2*s; j <= m; j *= 2) {
if (j < m && H[j] < H[j+1]) ++j;
if (rc >= H[j]) break;
H[s] = H[j]; s = j;
}
H[s] = rc;
} // HeapAdjust
void HeapSort(int H[]) {
// 对顺序表H进行堆排序
int i,temp;
for (i = 50; i > 0; --i)
HeapAdjust ( H, i, 100 );
for (i = 100; i > 1; --i) {
temp=H[i];
H[i]=H[1];
H[1]=temp;
HeapAdjust(H, 1, i-1);
}
} // HeapSort
void Merge (int SR[], int TR[], int i, int m, int n) {
// 将有序的SR[i..m]和SR[m+1..n]归并为有序的TR[i..n]
int j,k;
for (j = m+1, k = i; i <= m && j <= n; ++k) {
if (SR[i] <= SR[j]) TR[k] = SR[i++];
else TR[k] = SR[j++];
}
if (i <= m)
while (k <= n && i <= m) TR[k++] = SR[i++];
if (j <= n)
while (k <= n && j <= n) TR[k++] = SR[j++];
} // Merge
void MSort(int SR[], int TR1[], int s, int t) {
// 将SR[s..t]归并排序为TR1[s..t]
int m,TR2[101];
if (s == t) TR1[t] = SR[s];
else {
m = (s+t)/2;
MSort(SR,TR2,s,m);
MSort(SR,TR2,m+1,t);
Merge(TR2,TR1,s,m,t);
}
} // MSort
void MergeSort(int L[]) {
// 对顺序表L作归并排序
MSort(L, L, 1, 100);
} // MergeSort
void BubbleSort(int L[]) {
// 对顺序表L作冒泡排序
int i,j,fini = 0;
for (i = 1; i < 100 && !fini; i++) {
fini = 1;
for (j = 1; j <= 100-i; j++)
if (L[j] > L[j+1]) {
L[0] = L[j];
L[j] = L[j+1];
L[j+1] = L[0];
fini = 0;
}
}
}
void DblPPSort(int L[],int low,int high) {
int i,j,fini = 0;
while (low < high) {
fini = 1;
for (i = low; i<=high; i++)
if (L[i] > L[i+1]) {
L[0] = L[i];
L[i] = L[i+1];
L[i+1] = L[0];
fini = 0;
}
if (fini) break;
high--;
for (i = high; i>=low; i--)
if (L[i] > L[i+1]) {
L[0] = L[i];
L[i] = L[i+1];
L[i+1] = L[0];
fini = 0;
}
if (fini) break;
low++;
}
}
void DblBbbSort(int L[]) {
// 对顺序表L作双向冒泡排序
DblPPSort(L,1,99);
}
void main() {
int i,a[101];
srand(time(NULL));
puts("自动生成100个随机数:");
for (i = 1; i <= 100; i++) {
a[i] = rand()%100 + 1;
printf("%3d ",a[i]);
if (i%10==0) putchar('\n');
}
puts(" 选择排序法:\n"
"1:直接插入排序\n"
"2:折半插入排序\n"
"3:Shell插入排序\n"
"4:快速排序\n"
"5:简单选择排序\n"
"6:堆排序\n"
"7:归并排序\n"
"8:冒泡排序\n"
"9:双向冒泡排序");
scanf("%d",&i);
puts("排序结果:");
switch(i) {
case 1:InsertSort(a);break;//直接插入排序
case 2:BInsertSort(a);break;//折半插入排序
case 3:ShellSort(a);break;//Shell插入排序
case 4:QuickSort(a);break;//快速排序
case 5:SelectSort(a);break;//简单选择排序
case 6:HeapSort(a);break;//堆排序
case 7:MergeSort(a);break;//归并排序
case 8:BubbleSort(a);break;//冒泡排序
case 9:DblBbbSort(a);break;//双向冒泡排序
}
for (i = 1; i <= 100; i++) {
printf("%3d ",a[i]);
if (i%10==0) putchar('\n');
}
getchar();getchar();
}
◆◆
评论读取中....
请登录后再发表评论!
◆◆
修改失败,请稍后尝试