zoukankan      html  css  js  c++  java
  • 七种基本排序实现源码

    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

  • 相关阅读:
    java实现还款计算
    java实现风险度量
    java实现字符串比较
    java实现风险度量
    java实现风险度量
    java实现还款计算
    java实现还款计算
    java实现字符串比较
    java实现字符串比较
    java实现风险度量
  • 原文地址:https://www.cnblogs.com/riskyer/p/3333737.html
Copyright © 2011-2022 走看看