板子:
1,从数列中挑出一个元素,称为 “基准”(pivot);
2,重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
3,递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;
先以最左边的为一个基准,先从右边往左找一个 <pivot 的数,再从左往右找一个 >pivot 的数,然后交换,如果i=j,交换基准和i=j时的那个数,用变量 i 和变量 j 指向序列的最左边和最右边。刚开始时最左边 i=0 指向 pivot,最右边 j=最右边 指向 最后一个元素 ;
快速排序是不稳定的算法,它不满足稳定算法的定义。
算法稳定性 -- 假设在数列中存在a[i]=a[j],若在排序之前,a[i]在a[j]前面;并且排序之后,a[i]仍然在a[j]前面。则这个排序算法是稳定的!
code:
//从小到大
void quickSort(int left, int right, vector<int>& arr) { if(left >= right) return; int i, j, pivot, temp; i = left, j = right; pivot = arr[left]; //取最左边的数为基准数 while (i < j) { while (arr[j] >= pivot && i < j) j--; while (arr[i] <= pivot && i < j) i++; if(i < j) { temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } //基准数归位 arr[left] = arr[i]; arr[i] = pivot; quickSort(left, i - 1, arr);//递归左边 quickSort(i + 1, right, arr);//递归右边
}
//从大到小
code;
void quickSort(int left, int right, vector<int>& arr) { if(left >= right) //递归边界条件 return; if(left < 0 || right >= arr.size()) return;//非法输入判断,防止数组越界 int i, j, pivot, temp; i = left, j = right; pivot = arr[left]; //取最左边的数为基准数 while (i < j) { while (arr[j] <= pivot && i < j) j--; while (arr[i] >= pivot && i < j) i++; if(i < j) { temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } //基准数归位 arr[left] = arr[i]; arr[i] = pivot; quickSort(left, i - 1, arr);//递归左边 quickSort(i + 1, right, arr);//递归右边
}
1 #include<iostream> 2 #include<vector> 3 #include<algorithm> 4 using namespace std; 5 6 void quicksort(vector<int>& nums, int low, int high){ 7 if(low<high) 8 { 9 int i = low, j = high,t; 10 int temp = nums[low]; 11 while(i<j){ 12 while(i<j&&nums[j]>=temp) 13 j--;//先 从右向左找第一个小于temp的数,因为在j--的过程中会出现j<i的情况所以while语句中必须包含i<j 14 while(i<j && nums[i]<= temp) 15 i++;// 后从左向右找第一个大于等于temp的数 16 if(i<j) 17 { 18 t=nums[i]; 19 nums[i]=nums[j]; 20 nums[j]=t; 21 } 22 } 23 nums[low]=nums[i]; 24 nums[i] = temp; 25 quicksort(nums, low, i-1); 26 quicksort(nums, i+1, high); 27 } 28 } 29 30 int main() 31 { 32 int n; 33 while(cin>>n){ 34 vector<int>nums(n); 35 for(int i =0;i<n;++i){ 36 cin>>nums[i]; 37 } 38 quicksort(nums, 0, n-1); 39 for(int i =0;i<n;++i){ 40 cout<<nums[i]<<" "; 41 } 42 } 43 return 0; 44 }