其他分享
首页 > 其他分享> > 张仰彪排序法

张仰彪排序法

作者:互联网

起因

在泡CSDN,无意间刷到了一个看上去很有趣的东西,叫张仰彪排序法,看了看感觉还行,就写一篇笔记吧。

基本思路

思路十分新颖,总体来说就是排座位找到自己的排名再移过去

具体步骤如下:

{ \({\color{red}2}\), 5, 2, 4, 1, 3,0,4, 2,0 }

{ \({\color{red}4}\), 5, 2, 2, 1, 3,0,4, 2,0 }

{ \({\color{red}2}\), 5, 2, 2, 1, 3,0,4, 4,0 }

{ \({\color{red}1}\), 5, 2, 2, 2, 3,0,4, 4,0 }

{ \({\color{red}2}\), 5, 1, 2, 2, 3,0,4, 4,0 }

{ \({\color{red}3}\), 5, 1, 2, 2, 2,0,4, 4,0 }

{ \({\color{red}0}\), 5, 1, 2, 2, 2,3,4, 4,0 }

{ \({\color{red}0}\),5,1, 2, 2, 2,3,4,4,0 }

{ \({\color{red}0}\), 0, 1, 2, 2, 2,3,4, 4,5 }

代码

思路明晰后代码就很好懂了:

#include <bits/stdc++.h>
using namespace std;

int main()
{
	int a[10];
	int j = 0;/* 记录当前排序的位置 */
	int temp;/* 数据交换时的存储中介 */
	int order;/* 记录数据在数组里的大小排名,从小向大算 */
//  printf(" Input 10 numbers:\n");
	for (int i = 0; i < 10; i++)scanf("%d", &a[i]);
//  printf("\n");
	for (int i = 0; i < 9; i++)/* 排序的总次数比待排序数组的长度小1 */
	{
    	        order = j;/* 数据的排名从当前位置开始向后计算 */
		for (int x = j + 1; x < 10; x++)/* 计算当前数据在数组里的排名 */
		{
			if (a[x] < a[j])order++;     
		}   
    	        if (order > j)/* 如果当前数据的排名大于它现在的位置 */ 
    	        {
        	        while(a[j] == a[order])order++;/* 处理数组里的重复数据 */
        	        temp = a[order];/* 将这个数据交换到正确的位置上 */
        	        a[order] = a[j];
        	        a[j] = temp;
    	        }
    	        else j++;/* 如果当前数据的排名等于(不可能小于)它现在的位置 */ 
                /* 开始排下一个位置上的数据 */     
	}
//  printf("The sorted numbers is:\n");
	for (i = 0; i < 10; i++ )printf(" %d", a[i]);
	return 0;
}

总结

这个排序算法虽说并不是一个复杂度很优秀的算法,但毕竟是一个全新的算法,还是值得学习的(更何况是我们中国人发明的)。似乎比冒泡好一些

标签:color,位置,交换,数组,排名,张仰彪,排序,red
来源: https://www.cnblogs.com/GalaxyOier/p/15829246.html