数据结构排序算法

目录

1.冒泡排序-bubble

2.插入排序-insert

3.选择排序-select

4.希尔排序-shell

5.快速排序-quick

6.归并排序-marge

1.冒泡排序-bubble

思路:

1.从第一个数开始,将左右元素依次进行比较,交换,始终保持右边大于左边(第一次结束后,最右边为最大值)

2.对序列中剩下的n-1个元素再次执行 把最后一位确定下来

思维流程图:

代码实现:


2.插入排序-insert


思路

数组分为两部分

将数组中所有元素依次和前面已经排好顺序的元素比较,如果选择的元素比已排序的元素小,则交换,直到都比较过

  1. 用key将往前插入的元素保存起来a[i]=key
  2. 将key与已经排好的元素比较
  3. 若key<a[i-1]就交换(i--)

流程图

代码实现:


3.选择排序-select

思路:

找到最大+交换

  1. 从元素中找到最大
  2. 若最大元素不是最后一个,则与最后一个元素(n)交换
  3. n--;
  4. 从剩下的元素中,重复1-3

流程图:

代码实现


4.希尔排序-shell

思路:

  1. 将数组按照inc(n/2)长度进行分组,依次对各组分别进行插入排序
  2. 排完后inc变为1/2,重复上述操作
  3. 当inc=1时,直接对全体插入排序

流程图:

代码实现:


5.快速排序-quick

思路:

  1. 任取一个元素(如:第一个)为中心 ->point
  2. 所有比point小的元素放前面,所有大的放后面。形成左右两个子表
  3. 对各子表重新选择中心元素并重复步骤2->递归思想
  4. 直到每个子表的元素只剩下一个

流程图

代码实现

#include <stdio.h>

void swap(int a[],int low, int high)
{
	int temp;
	
	temp = a[low];
	a[low] = a[high];
	a[high] = temp;
}

int partition(int a[], int low, int high)//low=0;high=n-1 
{
	int point;//找枢纽元素 
	
	point = a[low];//把枢纽元素放最左边 
	
	while(low < high)//俩指针还没相遇 
	{
		while( low < high && a[high] >= point)
		{
			high--;
		}
		swap(a,low,high);
		
		while( low < high && a[low] <= point)
		{
			low++;
		}		
		swap(a,low,high);
	}
	return low;
}

void quick(int a[], int low, int high)//low数组起始位置 high数组结束位置 
{
	int point;
	
	if ( low < high )
	{
		point = partition(a,low,high);
		
		quick(a, low, point-1);
		
		quick(a, point+1, high);
	}
}

void quicksort(int a[],int n)
{
	quick(a, 0, n-1);//数组 初始位置 最后一个位置 
}

//辅助函数:打印数组
void print_arr ( int arr[], int n)
{
	for (int i = 0; i < n; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
 } 
 
int main(void)
{
	int a[10]={5,2,6,0,3,9,1,7,4,8,};
	
	quicksort(a,10);
	
	print_arr(a, 10);
}

6.归并排序-marge

基本思想:

先拆分数组,再合并数组

  1. 创建临时数组,存储排序完的数组
  2. 找到中间点,left right mid 划分数组 直到一个小数组有一个元素
  3. 2路合并

流程图

代码实现

#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;
//辅助数组B
int *B = (int *)malloc((7+1)*sizeof(int));
void Merge(int A[], int low, int mid, int high) 
{
	int i, j,k; 
	//表A的两段A[low...mid]和A[mid+1...high]各自有序
	//将他们合并成为一个有序表
	for(int k = low; k<=high; k++){
		B[k] = A[k];
	}
	for(i = low, j = mid+1, k=i; i<=mid&&j<=high; k++)
	{
		if(B[i]<=B[j])
		    A[k] = B[i++];      //A[]把之前的数据覆盖
		else
		    A[k] = B[j++];
	}
	//若第一个表为检测完成,复制 
	while(i<=mid)   A[k++] = B[i++];
	//若第二个表为检测完成,复制 
	while(j<=high)  A[k++] = B[j++];
}

void MerSort(ElemType A[], int low, int high) 
{
	if (low<high)
	{
		int mid = (low+high)/2;
		MerSort(A,low,mid);
		MerSort(A,low+1,high);
		Merge(A,low,mid,high); 
	}
}

int main()
{
	int arr[] = {2,5,7,10,4,8,6,9,};
	int low = 0;
	int high = 7;
	int M;
	int i;
	
	MerSort(arr, low, high); 
	
	for (i=0; i<=high; i++) {
		printf("%d ",arr[i]);
	}                    
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值