zoukankan      html  css  js  c++  java
  • 快速排序

    效果演示:

    原理分析(从小到大):

    1. 首先取出一个key,一般取第一个元素。
    2. 从后往前遍历,如果数组中的数据小于了key,那么就将从前往后未比较过的第一个位置即fisrt位置替换为该数据。
    3. 然后从前往后遍历,如果数组中的数据大于了key,那么就将从后往前的第一个比较过数据位置替换。
    4. 直到左右两边的位置重合,说明key就找到了正确的位置,每次循环就能找到一个数的正确位置。
    5. 然后将key左右两边的数据分为两组,递归调用自己。

    源码①:

    #include <iostream>
    using namespace std;
    
    #define N 10
    // left与right初值为序列下标(例如 1 与 n)
    void msort(int arr[], int low,int high){
    	int first=low;
    	int last=high;
    	int key=arr[first];
    	// 区间里面只有一个数或者没有数
    	if(low >= high){
    		return;
    	}
    	// 当前区间的长度超过1
    	while(first < last){
    		// 输入数据中有相同的数字时,会跑不出来...在while循环中,判断条件可以改成arr[last]>=key
    		while(first<last && arr[last]>=key){ // 反复左移
    			last--;
    		}
    		arr[first]=arr[last];
    		while(first<last && arr[first]<=key){ // 反复右移
    			first++;
    		}
    		arr[last]=arr[first];
    	}
    	arr[first]=key;
    	// 对左子区间递归进行快速排序
    	msort(arr,low,first-1);
    	// 对右子区间递归进行快速排序
    	msort(arr,first+1,high);
    }
    
    int main(){
    	int arr[N];
    	for(int i=0;i<N;i++){
    		cin >> arr[i];
    	}
    	msort(arr,0,N-1);
    	for(int i=0;i<N;i++){
    		cout << arr[i] << " ";
    	}	
    	return 0;
    }
    
    /*
    测试案例:
    	9 8 7 6 5 4 3 2 1 0 
    	9 8 8 6 5 4 5 2 1 0
        5 8 8 6 5 4 5 2 1 9
    */
    

    参考:https://blog.csdn.net/weixin_43864567/article/details/113753440

    欢迎查阅
  • 相关阅读:
    连接多台机子的多个数据库webconfig
    md5
    JavaScript substring() 方法
    Coolite ComboBox 模糊查询
    2010暴强语录
    Response.ContentType 说明
    C#得到磁盘信息
    Coolite Toolkit 1.0版本在线demo
    关于IT人职业道德的反思(转)
    Coolite TextField添加回车事件
  • 原文地址:https://www.cnblogs.com/gh110/p/15795689.html
Copyright © 2011-2022 走看看