c语言数组如何折半,C语言如何使用可变数组

2636e21b432a18d93ca31dd860886a30.png

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();

}

◆◆

评论读取中....

请登录后再发表评论!

◆◆

修改失败,请稍后尝试

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值