c语言各种常见排序算法汇总,常见的排序算法法汇总(C语言版)



#include

typedef int bool;

#define true 1

#define false 0

void swap(int *a, int *b)

{

int t = *a;

*a = *b;

*b = t;

}

void bubbleSort(int *a, int left, int right)

{

bool cond = true;

int i;

for (i = left; i < right; ++i)

{

cond = false;

int j;

for (j = right; j > i; --j)

if (a[j] < a[j - 1])

{

swap(&a[j], &a[j - 1]);

cond = true;

}

if (!cond)

return;

}

}

void selectSort(int *a, int left, int right)

{

int minPos;

int i;

for (i = left; i < right; ++i)

{

minPos = i;

int j;

for (j = i + 1; j <= right; ++j)

if (a[j] < a[minPos])

minPos = j;

if (i != minPos)

swap(&a[i], &a[minPos]);

}

}

void insertSort(int *a, int left, int right)

{

int p;

for (p = left + 1; p <= right; p++)

{

int tmp = a[p];

int j;

for (j = p; j > left

&& tmp < a[j - 1];

--j)

a[j] = a[j - 1];

a[j] = tmp;

}

}

int median3(int *a, int left, int right);

void quickSort(int *a, int left, int right)

{

if (left + 20 <= right)

{

int pivot = median3(a, left, right);

// begin partitioning

int i = left, j = right - 1;

for (;;)

{

while (a[++i] < pivot)

{

}

while (pivot < a[--j])

{

}

if (i < j)

swap(&a[i], &a[j]);

else

break;

}

// Restore pivot

swap(&a[i], &a[right -

1]);

// Sort small elements

quickSort(a, left, i - 1);

// Sort large elements

quickSort(a, i + 1, right);

}

else

insertSort(a, left, right);

}

int median3(int *a, int left, int right)

{

int center = (left + right) / 2;

if (a[center] < a[left])

swap(&a[left],

&a[center]);

if (a[right] < a[left])

swap(&a[left],

&a[right]);

if (a[right] < a[center])

swap(&a[center],

&a[right]);

swap(&a[center], &a[right -

1]);

return a[right - 1];

}

void merg(int *a, int left1, int right1, int left2, int

right2);

void mergSort(int *a, int left, int right)

{

int left1, right1, left2, right2, n = right - left + 1, size =

1;

while (size < n)

{

left1 = left;

while (left1 + size < n)

{

left2 = left1 + size;

right1 = left2 - 1;

if (left2 + size > n)

right2 = right;

else

right2 = left2 + size - 1;

merg(a, left1, right1, left2, right2);

left1 = right2 + 1;

}

size *= 2;

}

}

void merg(int *a, int left1, int right1, int left2, int

right2)

{

int k = 0, i = left1, j = left2, n1 = right1 - left1 + 1, n2 =

right2

- left2 + 1;

int tmp[n1 + n2];

while (i <= right1

&& j <=

right2)

if (a[i] < a[j])

tmp[k++] = a[i++];

else

tmp[k++] = a[j++];

while (i <= right1)

tmp[k++] = a[i++];

while (j <= right2)

tmp[k++] = a[j++];

for (i = 0; i < n1; ++i)

a[left1++] = tmp[i];

for (i = 0; i < n2; ++i)

a[left2++] = tmp[n1 + i];

//delete []tmp;

}

void filterDown(int *a, int i, int n);

void heapSort(int *a, int left, int right)

{

int n = right - left + 1;

int tmp[n];

int i;

for (i = 0; i < n; ++i)

tmp[i] = a[left + i];

for (i = n / 2; i >= 0; --i)

filterDown(tmp, i, n);

int j;

for (j = n - 1; j > 0; --j)

{

swap(&tmp[0], &tmp[j]);

filterDown(tmp, 0, j);

}

for (i = 0; i < n; ++i)

a[left + i] = tmp[i];

}

void filterDown(int *a, int i, int n)

{

int child;

int tmp;

for (tmp = a[i]; 2 * i + 1 < n; i =

child)

{

child = 2 * i + 1;

if (child != n - 1 && a[child]

< a[child + 1])

child++;

if (tmp < a[child])

a[i] = a[child];

else

break;

}

a[i] = tmp;

}

int main()

{

int d[] =

{ 7, 5, 6, 4, 2, 3, 1, 9, 8 };

int n;

for (n = 0; n < sizeof(d) / sizeof(int);

n++)

printf("%d", d[n]);

printf("\n");

int opt = 0;

printf("1 bubbleSort\n");

printf("2 selectSort\n");

printf("3 insertSort\n");

printf("4 quickSort\n");

printf("5 mergSort\n");

printf("6 heapSort\n");

printf("option:");

scanf("%d",&opt);

printf("\n");

switch (opt)

{

case 1:

bubbleSort(d, 0, 9);

break;

case 2:

selectSort(d, 0, 9);

break;

case 3:

insertSort(d, 0, 9);

break;

case 4:

quickSort(d, 0, 9);

break;

case 5:

mergSort(d, 0, 9);

break;

case 6:

heapSort(d, 0, 9);

break;

default:

printf("input error!\n");

exit(1);

}

for (n = 0; n < sizeof(d) / sizeof(int);

n++)

printf("%d", d[n]);

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值