排序篇(一)------快速排序

//排序算法-------快速排序,从大到小,并跟踪做标记,程序实现

#include <iostream>
using namespace st

#define Help_Mark 50
#define Max_Mark 0x7fffffff

void print(int n, double A[])
{
	for (int k = 1; k <= n; ++k)
	{
		cout << A[k] << " ";
	}
}


void QuickSort(double A[], int s, int t,double HelpMark[])    //对A[s]到A[t]进行快速排序,HelpMark[]记录,从大到小的元素对应的标号的顺序
{
	int i = s, j = t;

	if (s < t)
	{
		double tmp = A[s]; double temp2 = HelpMark[s];
		while (i != j)
		{
			while (A[j]<= tmp&&j>i)                                  //若改成A[j]>= tmp就是从小到大排
			{
				--j; 
			}
			A[i] = A[j]; HelpMark[i] = HelpMark[j];            //A[j]和A[i]元素怎么搞,HelpMark[]也跟着怎么搞

			while (A[i]>= tmp&&i < j)                              //若改成A[j]<= tmp就是从小到大排
			{
				++i;
			}
			A[j] = A[i]; HelpMark[j] = HelpMark[i];
		}

		A[i] = tmp; HelpMark[i] = temp2;

		QuickSort(A, s, i - 1, HelpMark);
		QuickSort(A, i + 1, t, HelpMark);
	}
	
}

int main()
{
	int n;
	cout << "请输入您要排序的数字个数" << endl;
	cin >> n;

	double HelpMark[100] = {0};
	for (int i = 1; i <= n; ++i)
		HelpMark[i] = i;

	double A[100] = { 0 };

	cout << "请输入要排序的数字,数字之间用空格间隔" << endl;
	for (int m = 1; m <= n; ++m)
	{
		cin >> A[m];
	}

	cout << "待排序的序列是这样,您看对吗" << endl;
	print(n, A); cout << endl;

	QuickSort(A, 1, n, HelpMark);

	print(n, A); cout << endl<<"与之对应的标号分别是: "; print(n, HelpMark);

}

(二)上述排序是以数组的第一个元素为基准的,最好能在数组随机生成一个数做基准,代码如下,着重学习

          Partition()函数与C++中随机数生成方法(我的博客有专门关于随机数生成的介绍)

#include <iostream>
#include <algorithm>
using namespace std;
#define random(a,b) (rand()%(b-a+1)+a)

int Partition(int data[], int length, int start, int end)
{
    if (data == NULL || length <= 0 || start<0 || end >= length)
    {
        cout << "输入数据有误" << endl;
        exit(0);
    }
    int pivot = random(start, end);
    swap(data[pivot], data[end]);
        int small = start - 1;
    for (int index = start; index<end; index++)
    {
        //如果index所指向的元素小于pivot枢纽元素的话,index和small游标一起向右走,当index所指向的元素大于或者等于pivot枢纽元素的话,只是index自己向右走,small不动,这样的话index走啊走啊 发现有一个小于pivot枢纽元素的时候,将此元素与small所指向的元素互换
        if (data[index]<data[end])//此处若改成大于号则从大到小排
        {
            ++small;
            if (small != index)
            {
                swap(data[index], data[small]);
            }
            
        }
        
    }
    ++small;
    //最后把small所指向元素与枢纽元素pivot互换
    swap(data[small], data[end]);
         return small;
}

void QuickSort(int data[], int length, int start, int end)
{
    if (start == end)
    {
        return;
    }

    int index = Partition(data, length, start, end);
    if (index > start)
        QuickSort(data, length,start, index - 1);
    if (index < end)
        QuickSort(data, length, index + 1, end);
}

int main()
{
    int a[10] = { 3, 1, 5, 9, 4, 8, 7, 2, 11, 15 };
    QuickSort(a, 10, 0, 9);

    for (int i = 0; i <= 9; ++i)
        cout << a[i];

    return 0;

}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值