七种基本排序实现源码

1.【插入排序】

 

void InsertSort(int* p ,int size)

{

	for(int i=1;i<size;i++)

	{

		int j	=	i;

		int t	= p[i];

		for(; j > 0 && p[j-1] > t; j--)

			p[j] = p[j-1];

		p[j] = t;

	}	

}


2.【选择排序】

 

 

void SelectSort(int* arr,int size)

{

	for(int i=0;i<size;i++)

	{

		int psn=i;

		for(int j=i;j<size;j++)

		{

			if(arr[j]<arr[psn])

				psn = j;

		}	

		swap(arr[psn],arr[i]);

	}	

}


3.【冒泡排序】

 

 

void BubbleSort(int* arr,int size)

{

	bool cg = true;		

	int  n	= 0;

	do

	{

		cg = false;	

		for (int i=0;i<size-1-n;i++)

		{

			if (arr[i]>arr[i+1])

			{

				cg = true;

				swap(arr[i],arr[i+1]);		

			}

		}	

		n++;

	} while (cg);

}


4.【快速排序】

 

 

void QuickSort(int* arr,int size)

{

    int *L,*R;

    if(size <= 1) return;

    if(2 == size)

    {

       if(arr[0] > arr[1])

         swap(arr[0],arr[1]);

       return;

    } 

    L = &arr[1];

    R = &arr[size -1];

    while(L < R)

   {

      while(L<R && *L < *arr) ++L;

      while(R>arr && !(*R < *arr)) --R;

     if(L<R) swap(*R,*L);

   }

   swap(*R,*arr);

   QuickSort(arr, R-arr);

   QuickSort(R+1,size -1 -(R-arr));

}


5.【堆排序】

 

 

void Shift(int* heap, int start, int end)

{

       int tmp = heap[start]; 

       int parent = start;

       int child = parent * 2 + 1; 

       while(child <= end)

     {

       if(child < end && 

	         heap[child] < heap[child+1])

                child++;



         if(tmp < heap[child])

        {

             heap[parent] = heap[child];

             parent = child;

             child = 2 * parent +1;

        } else  break;

     }

    heap[parent] = tmp;

}



void BuildHeap(int* heap,int size)

{

      for(int i=size/2-1; i >=0; i--)

         Shift(heap,i,size-1);



}



void HeapSort(int* heap,int size)

{

    BuildHeap(heap,size);

    for(int i = size-1; i>0; i--)

    {

          swap(heap[0],heap[i]);

          Shift(heap,0,i-1);

    }

}


6.【归并排序】

 

 

void Merge(int* arr,int first,int mid,int last)

{

     int size = last -first + 1;

     int* tmp = new int[size];

     int   b1 = first;

     int   e1 = mid;

     int   b2 = mid + 1;

     int   e2 = last;

     int    k = 0;

     while(b1<=e1 && b2<=e2)

       if(arr[b1]<arr[b2])

          tmp[k++] = arr[b1++];

       else tmp[k++] = arr[b2++];

    

     while(b1<=e1)   tmp[k++]=arr[b1++];

     while(b2<=e2)   tmp[k++]=arr[b2++];

     for(int i=0; i<size; i++)

        arr[first + i] = tmp[i];

     delete tmp;   

}



void MergeSort(int* arr,int first,int last)

{

    if(first < last)

    {

       int  mid = (first +last) / 2;

       MergeSort(arr,first,mid);

       MergeSort(arr,mid+1,last);

       Merge(arr,first,mid,last);

    }

}


7.【希尔排序】

 

void ShellSort(int *p, int size)

{

   int iTemp;

   for( int iStep = size/2; iStep > 0; iStep = iStep/2 ) {

     for( int i = iStep; i < size; ++i ) {

	iTemp = p[i];

	int j = i;

	for( ; j >= iStep; j -= iStep ) {   

	  if( iTemp < p[j-iStep] ) {

	    p[j] = p[j-iStep];

	  } else {

            break;

          }

	}

	p[j] = iTemp;

      }

    }

}


【代码测试】

 

#include<iostream>

#include<string>

using namespace std;



typedef void(*SortFunc)(int*, int, int*, int*);



// 插入排序

void InsertSort(int* p ,int size, int* move_cnt, int* compare_cnt)  

{  

    for(int i=1;i<size;i++)  

    {  

        int j   =   i;  

        int t   = p[i]; 

        ++*move_cnt; 

        ++*compare_cnt;

        for(; j > 0 && p[j-1] > t; j--) { 

            ++*compare_cnt;

            p[j] = p[j-1];  

            ++*move_cnt; 

        }

        p[j] = t;  

        ++*move_cnt; 

    }     

}  



// 希尔排序

void ShellSort(int *p, int size, int* move_cnt, int* compare_cnt)

{

	int iTemp;



	for( int iStep = size/2; iStep > 0; iStep = iStep/2 )

	{

		for( int i = iStep; i < size; ++i )

		{

             

			iTemp = p[i];

            ++*move_cnt;

			int j = i;

			for( ; j >= iStep; j -= iStep )

			{   

                ++*compare_cnt;

				if( iTemp < p[j-iStep] )

				{

					p[j] = p[j-iStep];

					++*move_cnt;

				}

				else

				{

					break;

				}

			}

			p[j] = iTemp;

			++*move_cnt;

		}

	}

}



// 冒泡排序

void BubbleSort(int* arr,int size, int* move_cnt, int* compare_cnt)  

{  

    bool cg = true;       

    int  n  = 0;  

    do  

    {  

        cg = false;   

        for (int i=0;i<size-1-n;i++)  

        {   

            ++*compare_cnt;

            if (arr[i]>arr[i+1])  

            {  

                cg = true;  

                swap(arr[i],arr[i+1]);     

                *move_cnt += 3;   

            }  

        }     

        n++;  

    } while (cg);  

}  



// 快速排序

void QuickSort(int* arr,int size, int* move_cnt, int* compare_cnt)  

{  

    int *L,*R;  

    if(size <= 1) return;  

    if(2 == size)  

    {  

       ++*compare_cnt;

       if(arr[0] > arr[1]) { 

         swap(arr[0],arr[1]);

         *move_cnt += 3; 

       }  

       return;  

    }   

    L = &arr[1];  

    R = &arr[size -1];  

    while(L < R)  

   {  

      ++*compare_cnt;

      while(L<R && *L < *arr) {

        ++*compare_cnt;

        ++L;

      }  

      ++*compare_cnt;

      while(R>arr && !(*R < *arr)) {

         ++*compare_cnt;

         --R; 

      } 

     ++*compare_cnt;

     if(L<R){

       swap(*R,*L);

       *move_cnt += 3; 

     }  

   }  

   swap(*R,*arr);  

   *move_cnt += 3; 

   QuickSort(arr, R-arr, move_cnt, compare_cnt);  

   QuickSort(R+1,size -1 -(R-arr), move_cnt, compare_cnt);  

}  



// 简单选择排序

void SelectSort(int* arr,int size, int* move_cnt, int* compare_cnt)  

{  

    for(int i=0;i<size;i++)  

    {  

        int psn=i;  

        for(int j=i;j<size;j++)  

        {    

            ++*compare_cnt;

            if(arr[j]<arr[psn]) {  

               psn = j;  

            }

        }     

        swap(arr[psn],arr[i]);  

        *move_cnt += 3; 

    }     

}  



void Shift(int* heap, int start, int end, int* move_cnt, int* compare_cnt)  

{  

       int tmp = heap[start];   

       ++*move_cnt;

       int parent = start;  

       int child = parent * 2 + 1;   

       while(child <= end)  

     {  

       ++*compare_cnt;

       if(child < end && heap[child] < heap[child+1]) { 

         ++child;  

       }

       ++*compare_cnt;

       if(tmp < heap[child])  

       {  

             heap[parent] = heap[child];  

             ++*move_cnt;

             parent = child;  

             child = 2 * parent +1;  

       } else  break;  

     }  

    heap[parent] = tmp;  

    ++*move_cnt;

}  

  

void BuildHeap(int* heap,int size, int* move_cnt, int* compare_cnt)  

{  

      for(int i=size/2-1; i >=0; i--)  

         Shift(heap,i,size-1, move_cnt, compare_cnt);  

  

}  

  

void HeapSort(int* heap, int size, int* move_cnt, int* compare_cnt)  

{  

    BuildHeap(heap, size, move_cnt, compare_cnt);  

    for(int i = size-1; i>0; i--)  

    {  

          swap(heap[0],heap[i]);  

          Shift(heap,0,i-1, move_cnt, compare_cnt);  

    }  

}  



void Merge(int* arr,int first,int mid,int last, int* move_cnt, int* compare_cnt)  

{  

     int size = last -first + 1;  

     int* tmp = new int[size];  

     int   b1 = first;  

     int   e1 = mid;  

     int   b2 = mid + 1;  

     int   e2 = last;  

     int    k = 0;  



     while(b1<=e1 && b2<=e2) { 

       ++*compare_cnt;

       if(arr[b1]<arr[b2])  

          tmp[k++] = arr[b1++];  

       else tmp[k++] = arr[b2++];  

       ++*move_cnt;

     }

     while(b1<=e1) {  

       tmp[k++]=arr[b1++];

       ++*move_cnt;  

       ++*compare_cnt;

     }

     while(b2<=e2) { 

       tmp[k++]=arr[b2++];

       ++*move_cnt;

       ++*compare_cnt;

     }  

     for(int i=0; i<size; i++)  { 

        arr[first + i] = tmp[i]; 

        ++*move_cnt;

     } 

     delete tmp;     

}  

  

void MergeSort(int* arr,int size, int* move_cnt, int* compare_cnt)  

{  

    if(size > 1)  

    {  

       int  mid = size / 2;  

       MergeSort(arr, mid, move_cnt, compare_cnt);  

       MergeSort(arr + mid, size - mid, move_cnt, compare_cnt);

       Merge(arr, 0, mid - 1, size -1, move_cnt, compare_cnt);  

    }  

}  



// 输出数组

void ShowArray(int * p, int size)

{

	for(int i = 0; i < size; i++)

	{

		cout<< p[i];

		if(i < size-1)

		{

			cout<< ", ";

		}

	}

	cout<< endl;

}



void CopyToTmp(int* arr, int* temp, int length) {

   	for( int i = 0; i < length; ++i )

	{

		temp[i] = arr[i];

		

	} 

}



int main()

{

	int arr[4][20] = { {-20, -15, -10, 0, 10, 18, 24, 41, 51, 62, 65, 75, 79, 82, 87, 89, 93, 96, 99, 100},

	               	   {100, 99, 96, 93,89, 87, 82, 79, 75, 65, 62, 51, 41, 24, 18, 10, 0, -10, -15, -20},

		               {99, 75, -10, 87, 41,100, 89, 65, 18, 93, 0, 51, 62, 10, -20, 82, 24, 96, -15, 79},

	                   {0} };

    const string arr_name[3] = {"顺序的数组" ,"逆序的数组", "随机的数组"};

    

    SortFunc sort_functions[7] = {InsertSort, SelectSort, BubbleSort, QuickSort, ShellSort, HeapSort, MergeSort };

    const string sort_func_name[7] = {"插入排序", "选择排序", "冒泡排序", "快速排序", "希尔排序", "堆排序", "归并排序" };

    int compare_cnt = 0, move_cnt = 0;

    cout <<  "========================================================" << endl;

    for (int i = 0; i < 7; ++i) {

        cout << "         **** " << sort_func_name[i] << " ****" << "       测试结果如下:" << endl ;

        cout <<  "========================================================" << endl;

      for (int j = 0; j < 3; ++j) {

          compare_cnt = 0;

          move_cnt = 0;

          CopyToTmp(arr[j], arr[3], 20);

          cout << endl << arr_name[j] << ":"; 

          ShowArray(arr[3], 20);

          sort_functions[i](arr[3], 20, &move_cnt, &compare_cnt);

          cout << sort_func_name[i] << "后: " ; 

          ShowArray(arr[3], 20);

          cout << sort_func_name[i] << "对" << arr_name[j] << "排序,共进行 " << compare_cnt << " 次比较 和 " << move_cnt << " 次移动" << endl; 

      }    

    cout << endl << "========================================================" << endl;

    } 

	system("pause");

	return 0;

}


 

 

【测试结果】

 

========================================================

         **** 插入排序 ****       测试结果如下:

========================================================





顺序的数组:-20, -15, -10, 0, 10, 18, 24, 41, 51, 62, 65, 75, 79, 82, 87, 89, 93, 96, 99, 100

插入排序后: -20, -15, -10, 0, 10, 18, 24, 41, 51, 62, 65, 75, 79, 82, 87, 89, 93, 96, 99, 100

插入排序对顺序的数组排序,共进行 19 次比较 和 38 次移动





逆序的数组:100, 99, 96, 93, 89, 87, 82, 79, 75, 65, 62, 51, 41, 24, 18, 10, 0, -10, -15, -20

插入排序后: -20, -15, -10, 0, 10, 18, 24, 41, 51, 62, 65, 75, 79, 82, 87, 89, 93, 96, 99, 100

插入排序对逆序的数组排序,共进行 209 次比较 和 228 次移动





随机的数组:99, 75, -10, 87, 41, 100, 89, 65, 18, 93, 0, 51, 62, 10, -20, 82, 24, 96, -15, 79

插入排序后: -20, -15, -10, 0, 10, 18, 24, 41, 51, 62, 65, 75, 79, 82, 87, 89, 93, 96, 99, 100

插入排序对随机的数组排序,共进行 132 次比较 和 151 次移动





========================================================

         **** 选择排序 ****       测试结果如下:

========================================================





顺序的数组:-20, -15, -10, 0, 10, 18, 24, 41, 51, 62, 65, 75, 79, 82, 87, 89, 93, 96, 99, 100

选择排序后: -20, -15, -10, 0, 10, 18, 24, 41, 51, 62, 65, 75, 79, 82, 87, 89, 93, 96, 99, 100

选择排序对顺序的数组排序,共进行 210 次比较 和 60 次移动





逆序的数组:100, 99, 96, 93, 89, 87, 82, 79, 75, 65, 62, 51, 41, 24, 18, 10, 0, -10, -15, -20

选择排序后: -20, -15, -10, 0, 10, 18, 24, 41, 51, 62, 65, 75, 79, 82, 87, 89, 93, 96, 99, 100

选择排序对逆序的数组排序,共进行 210 次比较 和 60 次移动





随机的数组:99, 75, -10, 87, 41, 100, 89, 65, 18, 93, 0, 51, 62, 10, -20, 82, 24, 96, -15, 79

选择排序后: -20, -15, -10, 0, 10, 18, 24, 41, 51, 62, 65, 75, 79, 82, 87, 89, 93, 96, 99, 100

选择排序对随机的数组排序,共进行 210 次比较 和 60 次移动





========================================================

         **** 冒泡排序 ****       测试结果如下:

========================================================





顺序的数组:-20, -15, -10, 0, 10, 18, 24, 41, 51, 62, 65, 75, 79, 82, 87, 89, 93, 96, 99, 100

冒泡排序后: -20, -15, -10, 0, 10, 18, 24, 41, 51, 62, 65, 75, 79, 82, 87, 89, 93, 96, 99, 100

冒泡排序对顺序的数组排序,共进行 19 次比较 和 0 次移动





逆序的数组:100, 99, 96, 93, 89, 87, 82, 79, 75, 65, 62, 51, 41, 24, 18, 10, 0, -10, -15, -20

冒泡排序后: -20, -15, -10, 0, 10, 18, 24, 41, 51, 62, 65, 75, 79, 82, 87, 89, 93, 96, 99, 100

冒泡排序对逆序的数组排序,共进行 190 次比较 和 570 次移动





随机的数组:99, 75, -10, 87, 41, 100, 89, 65, 18, 93, 0, 51, 62, 10, -20, 82, 24, 96, -15, 79

冒泡排序后: -20, -15, -10, 0, 10, 18, 24, 41, 51, 62, 65, 75, 79, 82, 87, 89, 93, 96, 99, 100

冒泡排序对随机的数组排序,共进行 189 次比较 和 339 次移动





========================================================

         **** 快速排序 ****       测试结果如下:

========================================================





顺序的数组:-20, -15, -10, 0, 10, 18, 24, 41, 51, 62, 65, 75, 79, 82, 87, 89, 93, 96, 99, 100

快速排序后: -20, -15, -10, 0, 10, 18, 24, 41, 51, 62, 65, 75, 79, 82, 87, 89, 93, 96, 99, 100

快速排序对顺序的数组排序,共进行 244 次比较 和 54 次移动





逆序的数组:100, 99, 96, 93, 89, 87, 82, 79, 75, 65, 62, 51, 41, 24, 18, 10, 0, -10, -15, -20

快速排序后: -20, -15, -10, 0, 10, 18, 24, 41, 51, 62, 65, 75, 79, 82, 87, 89, 93, 96, 99, 100

快速排序对逆序的数组排序,共进行 235 次比较 和 57 次移动





随机的数组:99, 75, -10, 87, 41, 100, 89, 65, 18, 93, 0, 51, 62, 10, -20, 82, 24, 96, -15, 79

快速排序后: -20, -15, -10, 0, 10, 18, 24, 41, 51, 62, 65, 75, 79, 82, 87, 89, 93, 96, 99, 100

快速排序对随机的数组排序,共进行 140 次比较 和 54 次移动





========================================================

         **** 希尔排序 ****       测试结果如下:

========================================================





顺序的数组:-20, -15, -10, 0, 10, 18, 24, 41, 51, 62, 65, 75, 79, 82, 87, 89, 93, 96, 99, 100

希尔排序后: -20, -15, -10, 0, 10, 18, 24, 41, 51, 62, 65, 75, 79, 82, 87, 89, 93, 96, 99, 100

希尔排序对顺序的数组排序,共进行 62 次比较 和 124 次移动





逆序的数组:100, 99, 96, 93, 89, 87, 82, 79, 75, 65, 62, 51, 41, 24, 18, 10, 0, -10, -15, -20

希尔排序后: -20, -15, -10, 0, 10, 18, 24, 41, 51, 62, 65, 75, 79, 82, 87, 89, 93, 96, 99, 100

希尔排序对逆序的数组排序,共进行 80 次比较 和 160 次移动





随机的数组:99, 75, -10, 87, 41, 100, 89, 65, 18, 93, 0, 51, 62, 10, -20, 82, 24, 96, -15, 79

希尔排序后: -20, -15, -10, 0, 10, 18, 24, 41, 51, 62, 65, 75, 79, 82, 87, 89, 93, 96, 99, 100

希尔排序对随机的数组排序,共进行 88 次比较 和 163 次移动





========================================================

         **** 堆排序 ****       测试结果如下:

========================================================





顺序的数组:-20, -15, -10, 0, 10, 18, 24, 41, 51, 62, 65, 75, 79, 82, 87, 89, 93, 96, 99, 100

堆排序后: -20, -15, -10, 0, 10, 18, 24, 41, 51, 62, 65, 75, 79, 82, 87, 89, 93, 96, 99, 100

堆排序对顺序的数组排序,共进行 126 次比较 和 119 次移动





逆序的数组:100, 99, 96, 93, 89, 87, 82, 79, 75, 65, 62, 51, 41, 24, 18, 10, 0, -10, -15, -20

堆排序后: -20, -15, -10, 0, 10, 18, 24, 41, 51, 62, 65, 75, 79, 82, 87, 89, 93, 96, 99, 100

堆排序对逆序的数组排序,共进行 108 次比较 和 101 次移动





随机的数组:99, 75, -10, 87, 41, 100, 89, 65, 18, 93, 0, 51, 62, 10, -20, 82, 24, 96, -15, 79

堆排序后: -20, -15, -10, 0, 10, 18, 24, 41, 51, 62, 65, 75, 79, 82, 87, 89, 93, 96, 99, 100

堆排序对随机的数组排序,共进行 118 次比较 和 108 次移动





========================================================

         **** 归并排序 ****       测试结果如下:

========================================================





顺序的数组:-20, -15, -10, 0, 10, 18, 24, 41, 51, 62, 65, 75, 79, 82, 87, 89, 93, 96, 99, 100

归并排序后: -20, -15, -10, 0, 10, 18, 24, 41, 51, 62, 65, 75, 79, 82, 87, 89, 93, 96, 99, 100

归并排序对顺序的数组排序,共进行 88 次比较 和 176 次移动





逆序的数组:100, 99, 96, 93, 89, 87, 82, 79, 75, 65, 62, 51, 41, 24, 18, 10, 0, -10, -15, -20

归并排序后: -20, -15, -10, 0, 10, 18, 24, 41, 51, 62, 65, 75, 79, 82, 87, 89, 93, 96, 99, 100

归并排序对逆序的数组排序,共进行 88 次比较 和 176 次移动





随机的数组:99, 75, -10, 87, 41, 100, 89, 65, 18, 93, 0, 51, 62, 10, -20, 82, 24, 96, -15, 79

归并排序后: -20, -15, -10, 0, 10, 18, 24, 41, 51, 62, 65, 75, 79, 82, 87, 89, 93, 96, 99, 100

归并排序对随机的数组排序,共进行 88 次比较 和 176 次移动




 

 

            原创文章,转载请注明: 转载自 IIcyZhao’s Road

 

 

          本文链接地址:http://blog.csdn.net/iicy266/article/details/11905851

 

 

 

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