zoukankan      html  css  js  c++  java
  • 常见排序算法总结

    归纳总结

    这个表格总结了各种排序算法的复杂度与稳定性:

    下面是关于相关排序的代码实现。

    冒泡排序

    #include <iostream>
    
    using namespace std;
    
    void bubbleSort(int a[], int len)
    {
    	int i, j, t;
    	//将最小的先放到第一个位置
    	for (i = 0; i < len - 1; i++)
    	{
    		for (j = len - 1; j > i; j--)
    		{
    			if (a[j] < a[j - 1])
    			{
    				t = a[j];
    				a[j] = a[j - 1];
    				a[j - 1] = t;
    			}
    		}
    	}
    	//将最大的先放到最后一个位置
    	/*for (i = 0; i < len - 1; i++)
    	{
    		for (j = 0; j <len - 1 - i; j++)
    		{
    			if (a[j] > a[j + 1])
    			{
    				t = a[j];
    				a[j] = a[j + 1];
    				a[j + 1] = t;
    			}
    		}
    	}*/
    }
    
    int main()
    {
    	int array[] = { 34, 65, 12, 43, 67, 5, 78, 10, 3, 70 }, k;
    	int len = sizeof(array) / sizeof(int);
    	cout << "The orginal array are:" << endl;
    	for (k = 0; k < len; k++)
    		cout << array[k] << ",";
    	cout << endl;
    	bubbleSort(array, len);
    	cout << "The sorted array are:" << endl;
    	for (k = 0; k < len; k++)
    		cout << array[k] << ",";
    	cout << endl;
    	system("pause");
    	return 0;
    }
    

    选择排序

    #include <iostream>
    
    using namespace std;
    
    void selectSort(int a[], int len)
    {
    	int i, j, k, tem;
    	for (i = 0; i < len - 1; i++)
    	{
    		k = i;
    		for (j = k + 1; j < len; j++)
    		{
    			if (a[k] > a[j])
    			{
    				k = j;
    			}
    		}
    		if (i != k)
    		{
    			tem = a[i];
    			a[i] = a[k];
    			a[k] = tem;
    		}
    	}
    }
    
    int main()
    {
    	int array[] = { 34, 65, 12, 43, 67, 5, 78, 10, 3, 70 }, k;
    	int len = sizeof(array) / sizeof(int);
    	cout << "The orginal array are:" << endl;
    	for (k = 0; k < len; k++)
    		cout << array[k] << ",";
    	cout << endl;
    	selectSort(array, len);
    	cout << "The sorted array are:" << endl;
    	for (k = 0; k < len; k++)
    		cout << array[k] << ",";
    	cout << endl;
    	system("pause");
    	return 0;
    }
    

    插入排序

    #include <iostream>
    //直接插入排序
    using namespace std;
    
    void insertSort(int arr[], int len)
    {
    	for (int i = 1; i < len; i++)
    	{
    		int j = i - 1;
    		int t = arr[i];
    		//从后往前,比当前值t大则往后移
    		while (j > -1 && t < arr[j])
    		{
    			arr[j + 1] = arr[j];
    			j--;
    		}
    		arr[j + 1] = t;
    	}
    }
    
    int main()
    {
    	int array[] = { 34, 65, 12, 43, 67, 5, 78, 10, 3, 70 }, k;
    	int len = sizeof(array) / sizeof(int);
    	cout << "The orginal array are:" << endl;
    	for (k = 0; k < len; k++)
    		cout << array[k] << ",";
    	cout << endl;
    	insertSort(array, len);
    	cout << "The sorted array are:" << endl;
    	for (k = 0; k < len; k++)
    		cout << array[k] << ",";
    	cout << endl;
    	system("pause");
    	return 0;
    }
    

    快速排序

    #include <iostream>
    
    using namespace std;
    
    void quickSort(int a[], int l, int r)
    {
    	if (l < r)
    	{
    		int i = l, j = r, x = a[l];
    		while (i < j)
    		{
    			while (i < j&&a[j] >= x)
    			{
    				j--;
    			}
    			if (i < j)
    			{
    				a[i++] = a[j];
    			}
    			while (i < j&&a[i] <= x)
    			{
    				i++;
    			}
    			if (i < j)
    			{
    				a[j--] = a[i];
    			}
    		}
    		a[i] = x;
    		quickSort(a, l, i - 1);
    		quickSort(a, i + 1, r);
    	}
    }
    
    int main()
    {
    	int array[] = { 34, 65, 12, 43, 67, 5, 78, 10, 3, 70 }, k;
    	int len = sizeof(array) / sizeof(int);
    	cout << "The orginal array are:" << endl;
    	for (k = 0; k < len; k++)
    		cout << array[k] << ",";
    	cout << endl;
    	quickSort(array, 0, len - 1);
    	cout << "The sorted array are:" << endl;
    	for (k = 0; k < len; k++)
    		cout << array[k] << ",";
    	cout << endl;
    	system("pause");
    	return 0;
    }
    

    归并排序

    #include <iostream>
    
    using namespace std;
    
    void merge(int arr[], int tempArr[], int start, int mid, int end)
    {
    	int i = start, j = mid + 1, k = 0;
    	while (i < mid + 1 && j < end + 1)
    	{
    		//谁小先放谁
    		if (arr[i] > arr[j])
    			tempArr[k++] = arr[j++];
    		else
    			tempArr[k++] = arr[i++];
    	}
    	//最后必有一边剩余,添加到后面即可
    	while (i < mid + 1)
    	{
    		tempArr[k++] = arr[i++];
    	}
    	while (j < end + 1)
    	{
    		tempArr[k++] = arr[j++];
    	}
    	//将排好的内容赋回原数组
    	for (i = 0, j = start; j < end + 1; i++, j++)
    	{
    		arr[j] = tempArr[i];
    	}
    }
    
    //主要就是递归的实现
    void mergeSort(int arr[], int tempArr[], int start, int end)
    {
    	if (start < end)
    	{
    		int mid = (start + end) / 2;
    		mergeSort(arr, tempArr, start, mid);
    		mergeSort(arr, tempArr, mid + 1, end);
    		merge(arr, tempArr, start, mid, end);
    	}
    }
    
    
    int main()
    {
    	int array[] = { 34, 65, 12, 43, 67, 5, 78, 10, 3, 70 }, k;
    	int len = sizeof(array) / sizeof(int);
    	int tempArray[10] = { 0 };
    	cout << "The orginal array are:" << endl;
    	for (k = 0; k < len; k++)
    		cout << array[k] << ",";
    	cout << endl;
    	mergeSort(array, tempArray, 0, len - 1);
    	cout << "The sorted array are:" << endl;
    	for (k = 0; k < len; k++)
    		cout << array[k] << ",";
    	cout << endl;
    	system("pause");
    	return 0;
    }
    

    堆排序

    #include <iostream>
    
    using namespace std;
    
    //数组arr局部调整为最大堆的实现,i为待调整元素下标,len为数组长度
    void heapAdjust(int arr[], int i, int len)
    {
    	int child, temp;
    	for (; 2 * i + 1 < len; i = child)
    	{
    		// 子结点的位置 = 2 * 父结点的位置 + 1
    		child = 2 * i + 1;
    		// 得到子结点中键值较大的结点,因为是调整为最大堆
    		if (child < len - 1 && arr[child] < arr[child + 1])
    		{
    			child++;
    		}
    		//如果较大的子结点大于父结点那么把较大的子结点往上移动,替换它的父结点
    		if (arr[i] < arr[child])
    		{
    			temp = arr[i];
    			arr[i] = arr[child];
    			arr[child] = temp;
    		}
    		else
    			break;
    	}
    }
    
    //堆排序的实现
    void heapSort(int arr[], int len)
    {
    	int i;
    	//数组arr调整为最大堆,调整完之后第一个元素是序列的最大的元素
    	for (i = len / 2 - 1; i >= 0; i--)
    	{
    		heapAdjust(arr, i, len);
    	}
    	//将第1个元素与当前最后一个元素交换,保证当前的最后一个位置的元素都是现在的这个序列中最大的
    	for (i = len - 1; i > 0; i--)
    	{
    		int temp = arr[0];
    		arr[0] = arr[i];
    		arr[i] = temp;
    		// 不断缩小调整heap的范围,每一次调整完毕保证第一个元素是当前序列的最大值
    		heapAdjust(arr, 0, i);
    	}
    }
    
    int main()
    {
    	int array[] = { 34, 65, 12, 43, 67, 5, 78, 10, 3, 70 }, k;
    	int len = sizeof(array) / sizeof(int);
    	int temparray[10] = { 0 };
    	cout << "the orginal array are:" << endl;
    	for (k = 0; k < len; k++)
    		cout << array[k] << ",";
    	cout << endl;
    	heapSort(array, len);
    	cout << "the sorted array are:" << endl;
    	for (k = 0; k < len; k++)
    		cout << array[k] << ",";
    	cout << endl;
    	system("pause");
    	return 0;
    }
    

    堆排序的一个实例过程:

    参考:

    1.各种排序算法总结
    2.十大经典排序算法(动图演示)
    3.十种排序算法总结

    感谢阅读,如有问题,请批评指正,谢谢。
  • 相关阅读:
    CentOS 7中为Yum设置代理
    在 .NET Core项目中使用UEditor图片、文件上传服务
    Android开发:通过 webview 将网页打包成安卓应用
    ElasticSearch:组合查询或复合查询
    ElasticSearch:常用的基础查询与过滤器
    SpringBoot:Java High Level REST Client 搜索 API
    SpingBoot:整合Elasticsearch7.2.0
    Linux:oracle11.2.0dbca静默建库
    Docker:跨主机通信
    Mysql无法启动情况下,如何恢复数据?
  • 原文地址:https://www.cnblogs.com/clwsec/p/11603587.html
Copyright © 2011-2022 走看看