C++数据结构与算法(十大排序)

目录

 

1 冒泡排序(Bubble Sort)

2 快速排序(Quick Sort)

3 插入排序(Insertion Sort)

4 希尔排序(Shell Sort)

5 简单选择排序(Selection Sort)

6 堆排序(Heap Sort)

7 二路归并排序(Merge Sort)

8 基数排序(Radix Sort)

9 桶排序(Bucket Sort)

10 计数排序(Counting Sort)

10种排序算法对比


1 冒泡排序(Bubble Sort)

算法思想:在扫描过程中,比较两两相邻记录,如果反序则交换,最终,最大记录就被“沉到”序列的最后一项,第二遍扫描将第二大“沉到”了倒数第二的位置,重复上述操作,直到n-1遍扫描后,整个序列是有序的。

算法实现:

程序说明:两个子函数都可以实现冒泡排序,但是void BubbleSort1(int a[], int n)把大的往后放是从后面进行交换的,void BubbleSort2(int a[], int n)也是把大的往后放,但是从前面交换的,原理一致。

#include<iostream>
using namespace std;

void BubbleSort1(int *a, int n);
void BubbleSort2(int *a, int n);

int main()
{
	int i;
	int a[7] = { 3, 2, 5, 8, 4, 7, 6 };
	BubbleSort2(a, 7);           //BubbleSort2(a, 7);
	for (i = 0; i < 7; i++)
		cout << a[i] << " ";
	cout << endl;
	system("pause");
	return 0;
}

void BubbleSort1(int a[], int n)
{
	int i, j, t;
	for (i = 1; i<n; i++)
	{
		for (j = n - 1; j >= 0; j--)
		{
			if (a[j] < a[j - 1])  //交换
			{
				t = a[j];
				a[j] = a[j - 1];
				a[j - 1] = t;
			}
		}
	}
}

void BubbleSort2(int a[], int n)
{
	int i, j, t;
	for (i = 1; i<n; i++)                 //可以写为:for(int i=0;i<n;++i)
	{
		for (j = 0; j <= n - i - 1; j++)  //可以写为:for(int j=0;j<n-i-1;++j)
		{
			if (a[j] > a[j + 1])  //交换
			{
				t = a[j];
				a[j] = a[j + 1];
				a[j + 1] = t;
			}
			
		}

		for (int k = 0; k < n; k++)
		{
			cout << a[k] << " ";
		}
		cout << endl;
	}
}

2 快速排序(Quick Sort)

算法思想:通过一趟排序将待排记录隔成独立的两部分,其中一部分记录的关键字比另一部分的关键字小,则可以分别对这两部分记录继续进行排序,以达到整个序列有序。

1)先从数列中取出一个数作为基准数;

2)分区:将基准数大的数全部放到它的右边,小于或者等于它的数全部放在它的左边;

3)再对左右区间重复第二步,直到各分区只剩一个数。

算法实现:

程序说明:(从小到大排序中)先从右到左扫描后从左到右扫描,次序不能变化。以下有两种不同的写法:

#include<iostream>
using namespace std;

void quickSort(int a[],int,int);

int main()
{
	int array[]={34,65,12,43,67,5,78,10,3,70},k;
	int len=sizeof(array)/sizeof(int);
	cout<<"The orginal arrayare:"<<endl;
	for(k=0;k<len;k++)
		cout<<array[k]<<",";
	cout<<endl;
	quickSort(array,0,len-1);
	cout<<"The sorted arrayare:"<<endl;
	for(k=0;k<len;k++)
		cout<<array[k]<<",";
	cout<<endl;
	system("pause");
	return 0;
}
 
void quickSort(int s[], int l, int r)
{
	if (l< r)
	{      
		int i = l, j = r, x = s[l];  //选取最左边的数作为基准 
		while (i < j)
		{
			while(i < j && s[j]>= x) // 从右向左找第一个小于x的数
				j--; 
			if(i < j)             //跳出循环,说明找到小于x的数 
				s[i++] = s[j];          //相当于将j处元素拷贝到i,并且i后移 
			while(i < j && s[i]< x) // 从左向右找第一个大于等于x的数
				i++; 
			if(i < j)             //跳出循环,说明找到大于等于x的数 
				s[j--] = s[i];          //相当于将i处元素拷贝到j,并且j左移 
		}
		s[i] = x;        //将基准拷贝到i处 
		quickSort(s, l, i - 1); // 递归调用  左    因为i是基准,此时i已经确定好在整个序列中的位置 
		quickSort(s, i + 1, r); // 递归调用  右 
	}
}
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <time.h>
using namespace std;


int partition(int arr[], int left, int right)  //找基准数 划分
{
	int i = left + 1;
	int j = right;
	int temp = arr[left];

	while (i <= j)
	{
		while (arr[i] < temp)
		{
			i++;
		}
		while (arr[j] > temp)
		{
			j--;
		}
		if (i < j)
			swap(arr[i++], arr[j--]);
		else i++;
	}
	swap(arr[j], arr[left]);
	return j;

}

void quick_sort(int arr[], int left, int right)
{
	if (left > right)
		return;
	int j = partition(arr, left, right);
	quick_sort(arr, left, j - 1);
	quick_sort(arr, j + 1, right);
}

//打印数组
void PrintArray(int array[], int len)
{
	for (int i = 0; i < len; i++)
	{
		cout << array[i] << " ";
	}
	cout << endl;
}

int main(void)
{
	const int NUM = 7;
	int array[NUM] = { 0 };
	srand((unsigned int)time(nullptr));
	for (int i = 0; i < NUM; i++)
	{
		array[i] = rand() % 100 + 1;
	}
	cout << "排序前:" << endl;
	PrintArray(array, NUM);
	cout << "排序后:" << endl;
	quick_sort(array, 0, NUM - 1);
	PrintArray(array, NUM);

	system("pause");
	return 0;
}
//快排   手动设置标志位 
#include<iostream>
#include<algorithm>
using namespace std;
int a[100],n;
void quickSort(int l,int r)
{
	int m=a[l]; //以中间元素作为关键数据时     int m=(l+r)/2; 
	int i=l,j=r;
	while(i<j)
	{ //直到i>j
		while(a[i]<m) i++; //从i开始向前搜索(i++),找到第一个大于m的值
		while(a[j]>m) j--; //从j开始向前搜索(j--),找到第一个小于m的值
		if(i<=j)
		{
			swap(a[i],a[j]);//交换a[i]和a[j]的值
			i++,j--; //同时i++,j--
		}
	}
	if(l<j) quickSort(l,j); //接下来分别对左边段[l,j]和右边段[i,r]利用同样的方法排序
	if(i<r) quickSort(i,r);
}

int main()
{
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	quickSort(1,n);
	for(int i=1;i<=n;i++) cout<<a[i]<<" ";
	return 0;
}

3  插入排序(Insertion Sort)

算法思想:在一个已排好序的记录子集的基础上,每一步将下一个待排序的记录有序插入到已排好序的记录子集中,直到将所有待排记录全部插入为止。

算法实现:

程序说明:第一个程序是简单插入排序,第二个程序包含简单插入排序和折半插入排序。

#include <iostream>
using namespace std;

void insertSort(int* a, int n)
{
	int i, j, k;

	for (i = 1; i < n; i++)
	{
		//为a[i]在前面的a[0...i-1]有序区间中找一个合适的位置
		for (j = i - 1; j >= 0; j--)
		if (a[j] < a[i])
			break;

		//如找到了一个合适的位置
		if (j != i - 1)
		{
			//将比a[
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值