排序算法

交换排序算法主要有:(1)冒泡法(2)快速排序法

冒泡法:两两相邻记录进行比较,如果反序这交换,直到没有反序的记录为止。

  

#include <iostream>
#include <vector>

using namespace std;

//这种交换方式效率较低
vector<int> BubbleSort(vector<int> &vec)
{
    for(int i=0; i<vec.size(); i++)
    {
        for(int j = i+1; j<vec.size(); j++)
        {
            if(vec[i] > vec[j])
            {
                // exchange using XOR
                vec[i] = vec[i] ^ vec[j];
                vec[j] = vec[i] ^ vec[j];
                vec[i] = vec[i] ^ vec[j];
            }
        }
    }
    return vec;
}

//这种交换方式效率较高
vector<int> BubbleSort2(vector<int> vec)
{
    for(int i=0; i<vec.size(); i++)
    {
        for(int j=vec.size()-1; j>i; j--)
        {
            if(vec[j] < vec[j-1])
            {
                // exchange using XOR
                vec[j] = vec[j] ^ vec[j-1];
                vec[j-1] = vec[j] ^ vec[j-1];
                vec[j] = vec[j] ^ vec[j-1];
            }
        }
    }

    return vec;
}


//这种交换方式效率更高,使用了一个标记符号flag避免无意义的循环
vector<int> BubbleSort3(vector<int> vec)
{
    bool flag = true;
    for(int i=0; i < vec.size() && flag; i++)
    {
        flag = false;
        for(int j=vec.size()-1; j>i; j--)
        {
            if(vec[j] < vec[j-1])
            {
                // exchange using XOR
                vec[j] = vec[j] ^ vec[j-1];
                vec[j-1] = vec[j] ^ vec[j-1];
                vec[j] = vec[j] ^ vec[j-1];
                flag = true;
            }
        }
    }

    return vec;
}

int main()
{
    vector<int> vec;
    int temp;
    cout<<"please input the data source, \
    integer in on row separated by space or comma"<<endl;
    while(1)
    {
        cin>>temp;
        vec.push_back(temp);
        if(cin.get() == '\n') break;
    }

    vector<int> sorted_vec = BubbleSort3(vec);

    vector<int>::iterator iter = sorted_vec.begin();
    for(; iter != sorted_vec.end(); iter++)
    {
        cout<<*iter<<" ";
    }

    return 0;
}

   快速排序:通过一趟排序将待排序的记录分割成独立的两个部分,其中一部分记录的值比关键字小,另一部分的记录都比关键字大。然后对着独立的部分进行递归操作,即可得到最后的排序结果。

 

#include <iostream>
#include <string>
using namespace std;

void QSort(int a[], int left, int right)
{
	if(left >= right)
	{
		return;
	}
	int i = left;
	int j = right;
	int key = a[left];  //用第一个记录作为关键字

	while(i<j)
	{
		while(i<j && key <= a[j])
		{
			j--;        //向左寻找
		}
		a[i] = a[j];    //找到一个比key小的元素,放在i的位置上
		while(i<j && key >= a[i])
		{
			i++;
		}
		a[j] = a[i];
	}

	a[i] = key;         //按照主键分类完成后,将主键放到中间的位置上
	QSort(a, left,i-1); //按照同样的方法,对划分出来的子集,再次做快速排序
	QSort(a, i+1, right);
}

int main()
{
	int src[100];
	int len = 0;
	cout<<"please input the data source :"<<endl;

	while(1)
	{
		cin>>src[len++];
		if(cin.get() == '\n') break;
	}
	QSort(src,0,len-1);

	for(int i=0; i<len; i++)
	{
		cout<<src[i]<<" ";
	}
	
	cin.get();
	return 0;

}

 

  

 

posted @ 2015-07-23 14:19  fangying  阅读(184)  评论(0编辑  收藏  举报