数据结构常用算法c语言,数据结构之常见的排序算法c语言实现

常见的简单排序算法有冒泡排序、选择排序、插入排序、快排、堆排序、归并排序、希尔排序等,这些排序的理论在网上有很多,这就只给出常见的排序算法源码,上学时候写的,不足之处欢迎大家指正。

下面几种排序的主函数入口为:int main(int argc, char* argv[])

{

int i, len;

int a[] = {8,5,6,4,9,10,3,15,2,17};

len = (sizeof(a) / sizeof(a[0]));

printf("before sort \n");

for (i = 0 ; i 

printf("%d,", a[i]);

}

printf("\n");

bubb_sort(a, len);

select_sort(a, len);

inert_sort(a, len);

printf("after sort \n");

for (i = 0 ; i 

printf("%d,", a[i]);

}

printf("\n");

return 0;

}

1、冒泡排序static void swap(int *x, int *y)

{

int tmp;

tmp = *x;

*x = *y;

*y = tmp;

}

void bubb_sort(int array[], int arr_len)

{

int i, j;

int flag;

for (i = 0; i 

flag = 0; /* identify the existing array is sorted or not */

for (j = 0 ; j 

if (array[j] > array[j + 1]) {

swap(&array[j], &array[j + 1]);

flag = 1;

}

}

if (flag == 0) {

break;

}

}

}

上面的代码为了加快比较速度,引入了变量flag,当无数据交换发生时,表示数据已经是有序的了,则可以直接结束排序。

2、选择排序void select_sort(int array[], int arr_len)

{

int tmp;

int i, j;

for (i = 0; i 

tmp = i;

for (j = i + 1; j 

if (array[j] 

tmp = j;

}

}

if (tmp != i) {

swap(&array[tmp], &array[i]);

}

}

}

3、插入排序void inert_sort(int array[], int arr_len)

{

int i, j;

int tmp;

for (i = 1; i 

tmp = array[i];

j = i - 1;

while ((j >= 0) && (array[j] > tmp)) {

array[j + 1] = array[j];

--j;

}

array[j + 1] = tmp;

}

}

以上三种排序算法,时间复杂度都为O(n2).

4、堆排序#define LEFT_CHILD(i) (2*(i) + 1)

void percdown(int a[],int i,int n)

{

int temp,child;

for (temp = a[i]; LEFT_CHILD(i) 

child = LEFT_CHILD(i);

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

child ++;

}

if (temp 

a[i] = a[child];

} else {

break;

}

}

a[i] = temp;

}

void heap_sort(int a[], int n)

{

int i;

/* 建立堆 */

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

percdown(a,i,n);

}

/* 删除最大值到堆的最后单元 */

for (i = n-1; i>0; i--) {

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

percdown(a,0,i);

}

}

5、希尔排序void shell_queue(int array[], int arr_len)

{

int gap, m, n, k;

gap = (arr_len / 2);

while (gap > 0) {

for (k = 0; k 

for (n = k + gap; n 

for (m = n - gap; m >= k; m -= gap) {

if (array[m] > array[m+gap]) {

swap(&array[m], &array[m+gap]);

} else {

break;

}

}

}

}

gap /= 2;

}

}

希尔排序和插入排序有点类似,上面的代码嵌套层数有点多,不太容易弄明白,带入几个数值试试就好了。

6、快速排序int mid_data(int array_a[], int left, int right)

{

int mid;

mid = (left + right) / 2;

if (array_a[left] > array_a[right]) {

swap(&array_a[left], &array_a[right]);

}

if (array_a[left] > array_a[mid]) {

swap(&array_a[left], &array_a[mid]);

}

if (array_a[mid] > array_a[right]) {

swap(&array_a[mid], &array_a[right]);

}

swap(&array_a[mid], &array_a[right-1]);

return array_a[right-1];

}

void insertion_sort(int array[], int len)

{

int tmp, i, j;

for (i = 1; i 

tmp = array[i];

for (j = i; (j  > 0) && (tmp 

array[j] = array[j-1];

}

array[j] = tmp;

}

}

void q_sort(int array_a[],int left,int right)

{

int i,j;

int mid;

if ((left + 3) <= right) {

mid = mid_data(array_a, left, right);

i = left;

j = right-1;

while (1) {

while(array_a[++i] 

while(array_a[--j] > mid);

if (i <= j) {

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

}

else {

break;

}

}

swap(&array_a[i], &array_a[right-1]);

q_sort(array_a, left, i - 1);

q_sort(array_a, i + 1, right);

} else {

insertion_sort(array_a + left, right - left + 1);

}

}

void quick_sort(int array[],int arr_len)

{

q_sort(array, 0, arr_len - 1);

}

快速排序是比较常用比较算法,先选取中值得时候很重要,本段代码采用中间和首位的数值去中间的值。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值