当前位置 博文首页 > ice_elephant的博客:数据结构算法之快速排序

    ice_elephant的博客:数据结构算法之快速排序

    作者:[db:作者] 时间:2021-09-16 15:45

    快速排序

    1. 每次选取第一个数为基准数;
    2. 然后使用“乾坤挪移大法”将大于和小于基准的元素分别放置于基准数两边;
    3. 继续分别对基准数两侧未排序的数据使用分治法进行细分处理,直至整个序列有序。
      对于下面待排序的数组:
      163 161 158 165 171 170 163 159 162
      数 第一步:先选择第一个数 163 为基准数,以 163 为基准将小于它的数排在它前面,大于等于它
      的数排在其后,结果如下:
      162 161 158 159 163 170 163 171 165
      此处,快速长老介绍了具体排列数据的 步骤
    4. 确定 163 为基准数后,先把 163 从数组中取出来
      161 158 165 171 170 163 159 162
    5. 然后从最右端开始,查找小于基准数 163 的数,找到 162,将其移至空出来的元素中,
      162 161 158 165 171 170 163 159
    6. 接下来,从最左边未处理的元素中从左至右扫描比基数 163 大的数,将其移动至右侧空出
      来的元素中
      162 161 158 171 170 163 159 165
    7. 接下来,继续从最右边未处理的元素中从右至左扫描比基数 163 小的数,将其移动至左侧
      空出来的元素中
      162 161 158 159 171 170 163 165
      接下来再重复执行步骤 3,171 执行右移
      162 161 158 159 170 163 171 165
      重复执行步骤 4,此时右边的值已经均大于基数,左边的值均已小于基数
      162 161 158 159 170 163 171 165
      接下来我们将基数保存回黄色空格中
      162 161 158 159 163 170 163 171 165
      第二步 : 采用分治法分别对基数左边和右边的部分运用第一步中的方法进行递归操作 , 直到整个
      数组变得有序,以左边的数组为例:
      162 161 158 159
      选择 162 为基数,运用“乾坤挪移大法”得到结果如下:
      159 161 158 162
      以 162 为界,把数组分成两个部分,此时,基数右侧已经没有数据,所以,接下来只要继续
      对左侧的数组分治处理即可,选择 159 为基数,再次运用“乾坤挪移大法”得到结果如下:
      158 159 161

    代码实现

    #include<stdio.h>
    #include<Windows.h>
    
    
    
    //快速排序
    int partion(int *arr,int low,int height){
    
    	//快速排序的一个子模块
    	
    	int base = arr[low];//第一个元素开始
    	int i = low;
    	int j = height;
    
    	if(low<height){
    	while(i<j){
    		//对第一个进行判断,第一个从右边的第j个开始找比base小的找不到的话j--
    		while(i<j&&arr[j]>=base){
    			j--;
    		}
    
    	//这是找到的情况
    	if(i<j){
    	//找到了让这个i这的下标位置存储这个j位置的元素
    		arr[i++] = arr[j];
    
    	}
    
    	//对左边的第i个元素开始找比base大的元素
    
    		
    		while(i<j&&arr[i]<base){
    			//找不到就让i++
    			i++;
    		}
    		//这个是找到的情况
    		if(i<j){
    			//找到了的话
    			arr[j--] = arr[i];
    		
    			}
    
    		}
    	
    		arr[i] = base;
    	}
    
    	//排序结束之后就是low = height
    
    	return i;
    }
    
    //归并算法
    void GB(int *arr,int low,int height){
    	//归并算法
    	//递归的思想分而治之
    	//那个return i为界限
    	if(low<height){
    		
    		int index = partion(arr,low,height);//进行这么样的一个循环的作用是第一次排序找到163逮出来,然后对下面的进行处理
    
    		GB(arr,low,index-1);
    		GB(arr,index+1,height);
    
    
    	}
    
    	
    
    }
    
    int main(void){
    
    	int arr[] = {163, 161, 158, 165, 171, 170, 163,159,162};
    	int len = sizeof(arr)/sizeof(arr[0]);
    	GB(arr,0,len-1);
    	
    	printf("快排完毕\n");
    	
    	for(int i=0;i<len;i++){
    		
    		printf("%d ",arr[i]);
    	}
    
    	printf("\n");
    
    
    
    	
    
    	system("pause");
    	return 0;
    	}
    
    cs