• 排序序列排序算法总结(二)——快速排序、归并排序


    最近研究排序序列,稍微总结一下,以后继续补充:

        快速排序

        排序想思:通过一趟排序将要排序的数据分割成独立的两分部,其中一分部的有所数据都比另外一分部的有所数据都要小,然后再按此法方对这两分部数据别分停止快速排序,全体排序进程可以递归停止,以此到达全体数据成变有序序列。其中,个人认为如何将数据按key排放这一步调最为主要,理解了这里,全体法算该应就明确了。

        排序实例:49 38 65 97 76 13 27

        

    停止第一次交换后:27 38 65 97 76 13 49           ( 按照法算的第三步从前面开始找,此时:J=6)

        

    停止第二次交换后:27 38 49 97 76 13 65           ( 按照法算的第四步从面前开始找> key的值,65>49,两者交换,此时:I=2 )

        

    停止第三次交换后:27 38 13 97 76 49 65           ( 按照法算的第五步将又一次执行法算的第三步从后开始找

        

    停止第四次交换后:27 38 13 49 76 97 65           ( 按照法算的第四步从面前开始找大于 key的值,97>49,两者交换,此时:I=3,J=5 )

        

    此时再执行第三和四步的时候就发明I=J=4,从而结束一趟快速排序,那么经过一趟快速排序后之的结果是:27 38 13 49 76 97 65,即有所大于 key49的数全体在49的前面,有所小于key(49)的数全体在key(49)的面前。

        否是定稳:否。

        时间复杂度:均平时间复杂度Ο(n log n) ,最坏为O(n^2)。

    void swap(int *pLeft,int *pRight)
    {
    	int temp;
    	temp = *pLeft;
    	*pLeft= *pRight;
    	*pRight = temp;
    }
    
    void my_quick_sort(int a[], int begin, int end)
    {
    	int compare=a[begin], left =begin,right = end;
    	if(left > right)
    	    return;
    
    	while(left < right)
    	{
    		while ((left < right) && (a[right] >= compare))
    			right--;
    		swap(&a[left], &a[right]);
    		while ((left < right) && (a[left] <= compare))
    			left++;
    		swap(&a[left], &a[right]);
    	}
    
    	my_quick_sort(a, begin, left-1);
    	my_quick_sort(a, left+1, end);
    }
        每日一道理
    书籍好比一架梯子,它能引领人们登上文化的殿堂;书籍如同一把钥匙,它将帮助我们开启心灵的智慧之窗;书籍犹如一条小船,它会载着我们驶向知识的海洋。

        
    并归排序

        排序想思:并归(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为多少个子序列,每个子序列是有序的。然后再把有序子序列合并为团体有序序列。

        否是定稳:定稳。

        时间复杂度:O(n*logn)。

    void mergearray(int a[], int first, int mid, int last, int temp[])
    {
    	int i = first, j = mid + 1;
    	int m = mid,   n = last;
    	int k = 0;
    	
    	while (i <= m && j <= n)
    	{
    		if (a[i] <= a[j])
    			temp[k++] = a[i++];
    		else
    			temp[k++] = a[j++];
    	}
    	
    	while (i <= m)
    		temp[k++] = a[i++];
    	
    	while (j <= n)
    		temp[k++] = a[j++];
    	
    	for (i = 0; i < k; i++)
    		a[first + i] = temp[i];
    }
    void mergesort(int a[], int first, int last, int temp[])
    {
    	if (first < last)
    	{
    		int mid = (first + last) / 2;
    		mergesort(a, first, mid, temp);    //左边有序
    		mergesort(a, mid + 1, last, temp); //右侧有序
    		mergearray(a, first, mid, last, temp); //再将二个有序数列合并
    	}
    }
    bool MergeSort(int a[], int n)
    {
    	int *p = new int[n];
    	if (p == NULL)
    		return false;
    	mergesort(a, 0, n - 1, p);
    	delete[] p;
    	return true;
    }

        
    注:文中分部代码考参了其他博文。

    文章结束给大家分享下程序员的一些笑话语录: 问:你觉得让你女朋友(或者任何一个女的)从你和李彦宏之间选一个,你觉得她会选谁?  
      答:因为李艳红这种败类,所以我没女友!

  • 相关阅读:
    DXF文件格式理解
    Qt Creator调试命令行参数
    qt编译错误:invalid new-expression of abstract class type "*"
    dxf文件解析库libdxf初探
    ubuntu linux编译libdxfrw
    CAD DWG/DXF文件C++解析库libdxfrw
    AutoCAD版本dxf文件与dxflib解析库支持探索
    Linux 6种日志查看方法(转)
    码率、分辨率、帧率和画质计算单位时间码流大小(转)
    纯手工打造车载车牌识别检测系统(转)
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3061655.html
Copyright © 2020-2023  润新知