C语言实现选择、冒泡、直接插入、归并、希尔、快速、堆排序与顺序、二分查找排序

①选择法排序
图解:
在这里插入图片描述

#include<stdio.h>
void select_sort(int *x, int n)
{
	int i, j;
	int temp;
	int min;
	for (i=0; i<n-1; i++)
	{
		min = i;//假设当前下标为i的数最小
		for (j=i+1; j<n; j++)
		{
			if(*(x+j)<*(x+min))
			{
				min = j;//如果后面的数比前面的小,则记下它的下标
			}
		}
		if (min != i)//如果min在循环中改变,就换数据
		{
			temp = *(x+i);
			*(x+i) = *(x+min);
			*(x+min) = temp;
		}
	}
}
int main()
{
	int a[5] = {3,2,5,4,1};
	int i;
	bubble_sort(a, 5);
	for (i=0; i<5; i++)
	{
		printf("%d", a[i]);
	}
	return 0;
}

②冒泡法排序
图解:
在这里插入图片描述

#include<stdio.h>
void bubble_sort(int *x, int n)
{
	int i, j;
	int temp;
	for (i=0; i<n-1; i++)//两两比较,n个数需要比较n-1次 
	{
		for (j=0; j<n-1-i; j++)/* n-1-i的含义每进行一次比从头到尾的比较,下一次从头到尾就少一次 */ 
		{
			if(*(x+j) > *(x+j+1)) 
			{
				temp = *(x+j+1);//如果前面的数比后面的大,就交换数据
				*(x+j+1) = *(x+j);
				*(x+j) = temp;
				
			}
		}
	}
}
int main()
{
	int a[5] = {3,2,5,4,1};
	int i;
	bubble_sort(a, 5);
	for (i=0; i<5; i++)
	{
		printf("%d", a[i]);
	}
	return 0;
}

③直接插入法排序
图解:
在这里插入图片描述

#include<stdio.h>
void insert_sort(int *x, int n)
{
	int i, j;
	int t;
	for (i=1; i<n; i++)
	{
		t = *(x+i);//暂存下标为i的数
		j = i - 1;
		while (t < *(x+j)&&j >= 0)
		{
			*(x+j+1) = *(x+j);//如果满足条件就往后挪
			j--;//下次循环与前面排好的数进行比较
		} 
		*(x+j+1) = t;/*在最后一次循环中由于*(x+j+1) = *(x+j)赋值导致两个数相同,故此句还原数据*/
	} 
}
int main()
{
	int a[5] = {3,2,5,4,1};
	int i;
	insert_sort(a, 5);
	for (i=0; i<5; i++)
	{
		printf("%d ", a[i]);
	}
	return 0;
}

快速排序:

#include <iostream>
using namespace std;
int Partition(int a[], int low, int high)
{
	int i = low, j = high, pivot = a[low];
	while (i < j)
	{
		while (i < j && a[j] > pivot)
		{
			j--;
		}
		if (i < j)
		{
			swap(a[i++], a[j]);
		}
		while (i < j && a[i] <= pivot)
		{
			i++;
		}
		if (i < j)
		{
			swap(a[i], a[j--]);
		}
	}
	return i;
}


//patition也可以这样写
int Partition2(int a[], int low, int high)
{
	int i = low, j = high, pivot = a[low];//基准元素
	while (i < j)
	{
		while (i < j && a[j] > pivot)
		{
			j--;//向左扫描 
		}
		while (i < j && a[i] <= pivot)
		{
			i++;//向右扫描 
		}
	} 
	if (a[i] > pivot)
	{
		swap(a[i - 1], a[low]);//i已经跑到大于pivot的区间 
		return i - 1;
	} 
	swap(a[i], a[low]);//i仍然在小于pivot的区间 
	return i;
}



void QuickSort(int a[], int low, int high)
{
	int mid;
	if (low < high)
	{
		mid = Partition(a, low, high);
		QuickSort(a, low, mid - 1);
		QuickSort(a, mid + 1, high);
	}
}
int main()
{
	int a[1000];
	int n;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> a[i];
	}
	QuickSort(a, 0, n - 1);
	for (int i = 0; i < n; i++)
	{
		cout << a[i] <<" ";
	}
	return 0;
}

归并排序:

#include <iostream>
using namespace std;
int a[20], b[20];
void mergesort(int L, int R)
{
	if (L >= R)
	{
		return;
	}
	int mid = L + R;
	mid /= 2;
	mergesort(L, mid);
	mergesort(mid + 1, R);
	int i = L, k = L;
	int j = mid + 1;
	while (i <= mid && j <= R)
	{
		if (a[i] <= a[j])
		{
			b[k++] = a[i++];
		}
		else
		{
			b[k++] = a[j++];
		}
	}
	while (i <= mid)//将imid-i和R-j两组有序序列,归并在一个有序序列中
	{
		b[k++] = a[i++];//将mid-i剩余的数放在最后
	}
	while (j <= R)
	{
		b[k++] = a[j++];//将r-j剩余的数放在最后
	}
	for(k = L;k <= R; k++)//将b数组中的数据拷贝到原数组中
	{
		a[k] = b[k];
	}
}
int main()
{
	int n;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> a[i];
	}
	mergesort(0, n - 1);
	for (int i = 0; i < n; i++)
	{
		cout << a[i] << " ";
	}
	return 0;
}

堆排序:

#include<iostream>
using namespace std;
/*
14
99 5 36 7 22 17 46 12 2 19 25 28 1 92
*/
const int SIZE_ARRAY = 101;

int heap[SIZE_ARRAY] = {0}; // 堆中元素

int n;//堆中元素个数

//交换函数
void heapSwap(int x, int y) {
	int temp = heap[x];
	heap[x] = heap[y];
	heap[y] = temp;
}

 //向下调整函数

void siftDown(int i) 
{//传入一个需要向下调整的节点编号
	int t, flag = 0;//flag 标记师傅需要向下调整
	//当i节点有儿子,并且需要继续调整就执行
	while (i * 2 <= n && !flag)
	{
		//首先判断他和左儿子的关系,并用t记录较大值的节点编号
		if (heap[i] < heap[i * 2]) 
		{
			t = i * 2;
		}
		else
		{
			t = i;
		}
		//如果有右儿子
		if (i * 2 + 1 <= n) 
		{
			if (heap[t] < heap[i * 2 + 1]) 
			{
				t = i * 2 + 1;
			}
		}
		if (t != i)
		{
			heapSwap(t, i);
			i = t;
		}
		else
		{
			flag = 1;
		}
	}
}
//建立堆的函数
void creatHeap() 
{
	int i;
	//从最后一个非叶节点到第1个节点依次进行向上调整
	for (i = n / 2; i >= 1; i--) 
	{
		siftDown(i);
	}
}

//堆排序
void heapSort() 
{
	while (n > 1) 
	{
		heapSwap(1, n);
		n--;
		siftDown(1);
	}
}

int main(void) {
	int i, num;
	std::cin >> num;
	for (i = 1; i <= num; i++)
		cin >> heap[i];
	n = num;
	//建堆
	creatHeap();
	//堆排序
	heapSort();

	for (i = 1; i <= num; i++)
	{
		cout << heap[i] << " ";
	}
	cout << endl;
	return 0;
}

待更新。。。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值