练习编程6:数据结构与算法の排序の冒泡+选择排序+希尔排序+堆排序

神器网站:小菜学算法

冒泡排序

int sort_bubble(struct Array *array)
{
	int i;
	int j;
	int tmp;

	if(array->length < 2)
		return ERROR;						//当只有一个元素是不需要排序的;
	
	for(i=0; i<array->length-1; i++)			//我们下标就从0开始,只需要lengh-1趟
		for(j=i+1; j<array->length; j++)	// 和i后的每个元素比较
		{
			if(array->arr[i] > array->arr[j])
			{
				tmp = array->arr[i];
				array->arr[i] = array->arr[j];
				array->arr[j] = tmp;
			}
		}
	return OK;
}

快速排序

int findPos(int* a, int low, int high)
{
	int val = a[low];
	while (low < high)
	{
		while ((low < high) && (a[high] > val))
			high--;
		a[low] = a[high];
		while ((low < high) && (a[low] <= val))
			low++;
		a[high] = a[low];
	}
	a[low] = val;
	return low;

}

void quickSort(int* a, int low, int high)
{
	int pos;
	if (low < high)
	{
		pos = findPos(a, low, high);
		quickSort(a, low, pos-1);
		quickSort(a, pos+1, high);
	}
}

选择排序

int selectSort(struct Array* array)
{
	int min;
	int i, j;
	if (len < 2)
		return;
	for (int i = 0; i < len-1; i++)
	{
		min = i;
		for (j = i + 1; j < len; j++)
		{
			if (a[j] < a[min])
				min = j;
		}

		if (min != i)
			swap(&a[min], &a[i]);
	}
}

插入排序

选择排序逐步调试

void insertSort(int* a, int len)
{
	if (len < 2)
		return;
	for (int i = 1; i < len; i++)
	{
		int val = a[i];
		int j = i - 1;
		while ((j >= 0) && (a[j] > val))
		{
			a[j + 1] = a[j];   // 大值往后移位
			j--;
		}
		a[j + 1] = val;
	}
}

其他实现

#include <stdio.h>
int main(){
    /* 插入排序*/
    int a[7] = {6,1,7,5,4,9,3};
    int cur;
    int i, j;
    int length = sizeof(a)/sizeof(a[0]);
    
    for (i = 1; i < length; i++)
    {
        val = a[i];    //待排序元素
        for (j = i - 1; j >= 0 && a[j] > val; j--)
        {
            a[j + 1] = a[j];
        }
        a[j + 1] = val;
    }
    
    for (int k = 0; k < length; ++k) {
        printf("%d",a[k]);
        printf(" ");
    }
}

希尔排序

int shell_sort(struct Array *array)
{
	int i,j,increment;
	increment = array->length;

	do{
		increment = increment/3 + 1;
		for(i=increment+1 ; i<array->length; i++)
		{
			if(array->arr[i] < array->arr[i-increment])
			{
				array->arr[0] = array->arr[i];
				for(j=i-increment; j>0 && array->arr[j] > array->arr[0]; j-=increment)
				{
					array->arr[j+increment] = array->arr[j];	//发现后面有更小的,前移
				}
				array->arr[j+increment] = array->arr[0];		//把i位置的值付给后面前移之后空下来的位置
			}
		}
	}while(increment>1);

	return OK;
}

堆排序

void heap_adjust(struct Array *array, int s, int m)
{
	int temp, j;
	temp = array->arr[s];
	for(j=2*s; j<=m; j*=2)
	{
		if(j<m && array->arr[j] < array->arr[j+1])
			++j;
		if(temp >= array->arr[j])
			break;
		array->arr[s] = array->arr[j];
		s = j;
	}
	array->arr[s] = temp;
}

void heap_sort(struct Array *array)
{
	int i;
	for(i=array->length/2; i>0;i--)
		heap_adjust(array, i, array->length);

	for(i=array->length; i>1; i--)
	{
		swap(array, 1, i);
		heap_adjust(array, 1, i-1);
	}

测试

int traserse_array(struct Array *array)
{
	int i;

	if(array->length == 0)
		return ERROR;

	for(i=1; i<=array->length; i++)
		printf("%d ", array->arr[i]);
	printf("\n");

	return OK;
}

void swap(struct Array *array, int i, int j)
{
	int temp = array->arr[i];
	array->arr[i] = array->arr[j];
	array->arr[j] = temp;
}

int main()
{
	int init_Arr[]={0,8,1,4,2,5,3,7,6,-1};	// 0是哨兵,不作为实际元素;-1是结束标志位,
	struct Array array;
	int mode=0;

	init_array(&array, init_Arr);

	printf("array length: %d \n", array.length);
	traserse_array(&array);

	mode = 1;	//选择排序模式

	switch(mode)
	{
		case 1: {sort1_bubble(&array);break;}
		case 2: {sort2_bubble(&array);break;}
		case 3: {sort3_bubble(&array);break;}
		case 4:	{select1_sort(&array);break;}
		case 5:	{insert_sort1(&array);break;}
		case 6:	{shell_sort(&array);break;}
		case 7:	{heap_sort(&array);break;}
		default: break;
	}

	traserse_array(&array);
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值