排序算法

交换排序算法主要有:(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;



}

 

  

 

你可能感兴趣的:(排序算法)