交换排序(冒泡排序、快速排序)

冒泡排序                              

排序过程:

      设数组长度为n,按从小到大排序
      1 .比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。这样对数组的第 0个数据到 n-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第 n-1个位置。排序共进行 n-1次比较;
        2 .n=n-1 ,如果n不为 0就重复第一步,比较前 n-1个数。排序共进行 n-2次;
        3.以此类推,共做n-1次排序,完成排序过程

复杂度

       若文件的初始状态是正序的,一次排序即可完成。所需比较次数为 n-1次,记录移动次数为 0。因此,冒泡排序最好的时间复杂度为O(n)
     若初始文件是反序的,需要进行 n-1次排序。每次排序要进行 n-i次比较 (1<=i<=n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较次数达到最大值 n(n-1)/2=O(n^2),移动次数也达到最大值3n(n-1)/2=O(n^2)。因此,冒泡排序的最坏时间复杂度为O(n^2)

  代码:
void BubbleSortt(int *arr,int n)
{
	if(NULL == arr)
		return;
	int i,j,flag,temp;
	for( i = 0; i < n-1; i++)   // 进行n-1次排序
	{
		flag = 1;
		for( j = 0; j < n-i-1; j++){   // 每次排序进行n-1-i次比较
			if(arr[j] > arr[j+1]){
				temp= arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = temp;
				flag = 0;
			}
		}
		if(1 == flag){
			printf( "%d",i); // 首先打印出,在第几层循环时顺序已排好
			break; // 跳出循环
		}
	}
}


快速排序                              


快速排序是对冒泡排序的一种改进


它的基本思想

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

排序过程
     第一步,在待排序的 n个数中任取一个数,以该数作为标准,将所有数分成两组,第 1组各数都小于等于标准,第 2组各数都大于该标准,并把该标准排在这两组中间。
     第二步,采用同样的方法,对左边的组和右边的组进行排序,直到所有记录都排到相应的位置为止。

复杂度
     快速排序每次将待排序数组分为两个部分,在理想状况下,每一次都将待排序数组划分成等长两个部分,则需要 logn次划分。
   而在最坏情况下,即数组已经有序或大致有序的情况下,每次划分只能减少一个元素,快速排序将不幸退化为冒泡排序,所以快速排序时间复杂度最好时为O(nlogn),最坏情况为O(n^2)。在实际应用中,快速排序的平均时间复杂度为 O(nlogn)

代码:

void Quick_Sort(int arr[],int low, int high)  //low 和high是数组的下标
{
    if(NULL == arr)
		return;
	if(low<high)
	{
		int temp = arr[low];
		int l=low,h=high;
        while(l<h)
        {
			while(arr[h]>=t)     h--;
            arr[l] = arr[h];
            while(arr[l]<t)      l--;
            arr[h] = arr[l];
		}
        arr[h] = temp;
        Quick_Sort(A,low,h-1);
        Quick_Sort(A,h+1,high);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值