数据结构与算法笔记 --- 排序

1、插入排序算法:

思想:从数组下标1的数据开始往前面比较。一次到依次标为N为止

#include <stdio.h>

void  Insert(int a[], int num);

void  Insert(int a[], int num)
{
	int i = 0, j = 0,temp=0;
	for (i = 1; i < num;i++){
		j = i;
		temp = a[i];//得到要插入的数据
		for (; j>0, a[j - 1] > temp;j--){ //说明排序好的数据比temp大,所以要将其往后移一个位置
			a[j] = a[j - 1];
		}
		a[j] = temp;//来到这里已经说明已经要找插入的合适位置了
	}
}

void main(void)
{
	int i = 0;
	int kk[6] = { 34, 8, 64, 51, 32, 21 };
	Insert(kk, 6);
	for (i = 0; i < 6; i++){

		printf(" %d ", kk[i]);
	}
	printf("\n");
	getchar();

}

2、希尔排序
希尔排序按其设计者希尔(Donald Shell)的名字命名,它是一种基于插入排序的快速排序算法。,这个算法优于插入排序法
思想:设定一个步长间隔n,从下标0开始于间隔n的数据进行比较,然后逐渐减小间隔N,当N为1的时候,就相当于插入排序了。

#include <stdio.h>

void Xepx(int a[], int nums)
{
	int i = 0, j = 0, k =0,temp = 0;
	for (k = nums / 2; k > 0;k/=2){//第一步:得到交换的间隔

		for (i = k; i < nums;i++){
			
			for (j = i; j >= k;j-=k){ //由于步长是K,所以要以他为基准点,
				if (a[j]<a[j-k]){ //,如果排序不对,交换数据进行排序
					temp = a[j - k];
					a[j - k] = a[j];
					a[j] = temp;
				}else{  //否则直接进行下一个排序
					break;
				}
			}
		}
	}
}

void main(void)
{
	int i = 0;
	int kk[] = { 34, 8, 64, 51, 32, 21,12,45,7,89,66,10};
	Xepx(kk, 12);
	for (i = 0; i < 12; i++){

		printf(" %d ", kk[i]);
	}
	printf("\n");
	getchar();

}

在这里插入图片描述

3、堆排序,前面学习过了,就是利用堆的有序性

4、快速排序

就是寻找一个中枢元素,比它大的数据在左边,比它小的数据在右边,递归操作即可

#include <stdio.h>

void swap(int *a, int *b);
int seekzs(int a[], int zuo, int you);
void  Insert(int a[], int num);

void  Insert(int a[], int num)
{
	int i = 0, j = 0, temp = 0;
	for (i = 1; i < num; i++){
		j = i;
		temp = a[i];//得到要插入的数据
		for (; j>0, a[j - 1] > temp; j--){ //说明排序好的数据比temp大,所以要将其往后移一个位置
			a[j] = a[j - 1];
		}
		a[j] = temp;//来到这里已经说明已经要找插入的合适位置了
	}
}

//交换数据
void swap(int *a, int *b)
{
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}

//寻找中枢元素
//要保证三个数中 左 < 中 < 右
//然后中间的元素要和右边的上一位交换位置
int seekzs(int a[], int zuo, int you)
{
	int zhong = (zuo + you)/2;//得到中间元素的下标
	if (a[zuo]>a[zhong]){
		swap(&a[zuo],&a[zhong]);
	}

	if (a[zuo]>a[you]){
		swap(&a[zuo], &a[you]);
	}

	if (a[zhong]>a[you]){
		swap(&a[zhong], &a[you]);
	}
	swap(&a[zhong], &a[you-1]);
	return a[you - 1];
}

int kuaisu(int a[], int left, int right)
{
	int zsnum = 0,i=0,j=0;
	if (left + 3 <= right){ //三个元素以上用快速排列

		zsnum = seekzs(a, left, right); //得到中枢元素
		i = left,
		j = right - 1;
		while (1){
			while (a[++i] <= zsnum);// 找到数据大于中枢元素的数据
			while (a[--j] >= zsnum);// 找到数据小于于中枢元素的数据
			if (i < j){ //判断下标位置是否是正确的
				swap(&a[i], &a[j]);
			}else{
				break;
			}
		}
		//然后递归在进行排序
		kuaisu(a, left, i - 1);  
		kuaisu(a, i, right);

	}else{ //用普通的插入法
		Insert(a + left, right - left + 1);
	}

}

void main(void)
{
	int i = 0;
	int kk[] = { 66, 8, 64, 51, 32, 21,12,45,7,89,66,10};
	
	kuaisu(kk,0,11);
	for (i = 0; i < 12; i++){

		printf(" %d ", kk[i]);
	}
	printf("\n");
	getchar();

}

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值