wenbao与排序
快排
确定一个基数,从后往前找比他小的第一个,交换。再从左往右找地一个大于他的第一个,交换。。连续执行。。。。。。
引用百度百科:
一趟快速排序的算法是:
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换;
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;
5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。
1 #include <iostream> 2 #include <stdlib.h> 3 #include <time.h> 4 using namespace std; 5 const int maxn = 10; 6 int arr[maxn]; 7 void print(){ 8 for(int i = 0; i < maxn; i++) cout << arr[i]<<" "; 9 cout << endl; 10 } 11 int part(int *arr, int lx, int rx){ 12 int low = lx, high = rx; 13 int temp = arr[lx]; 14 while(low < high){ 15 while(low < high && arr[high] >= temp) -- high; 16 arr[low] = arr[high]; 17 while(low < high && temp >= arr[low]) ++ low; 18 arr[high] = arr[low]; 19 } 20 arr[low] = temp; 21 cout<<"-------"<<endl; 22 print(); 23 return low; 24 } 25 void quicksort(int *arr, int begin, int end){ 26 if(begin < end){ 27 int pos = part(arr, begin, end); 28 quicksort(arr, begin, pos-1); 29 quicksort(arr, pos+1, end); 30 } 31 } 32 int main(){ 33 for(int i = 0; i < maxn; i ++){ 34 //arr[i] = rand()%100; 35 cin >> arr[i]; 36 } 37 quicksort(arr, 0, maxn-1); 38 print(); 39 return 0; 40 }
1 #include <iostream> 2 using namespace std; 3 const int maxn = 10; 4 int arr[maxn]; 5 void print(){ 6 for(int i = 0; i < maxn; i++) cout << arr[i]<<" "; 7 cout << endl; 8 } 9 void quicksort(int *arr, int begin, int end){ 10 if(begin < end){ 11 int low = begin, high = end; 12 int temp = arr[begin]; 13 while(low < high){ 14 while(low < high && arr[high] >= temp) -- high; 15 arr[low] = arr[high]; 16 while(low < high && temp >= arr[low]) ++ low; 17 arr[high] = arr[low]; 18 } 19 arr[low] = temp; 20 cout<<"-------"<<endl; 21 print(); 22 quicksort(arr, begin, low-1); 23 quicksort(arr, low+1, end); 24 } 25 } 26 int main(){ 27 for(int i = 0; i < maxn; i ++){ 28 cin >> arr[i]; 29 } 30 quicksort(arr, 0, maxn-1); 31 print(); 32 return 0; 33 }
------------------------------------------------------------------------
归并排序
利用递归加分治的思想逐步排序,可高效处理逆序对问题
1 #include <iostream> 2 using namespace std; 3 const int maxn = 1e5+10; 4 int n, a[maxn], L[maxn/2], R[maxn/2]; 5 long long sum = 0; 6 void d(int A[], int l, int mid, int r){ 7 int i, j; 8 for(i = l; i <= mid; ++i){ 9 L[i-l] = A[i]; 10 } 11 for(j = mid+1; j <= r; ++j){ 12 R[j-mid-1] = A[j]; 13 } 14 L[i-l] = R[j-mid-1] = 1e9+10; 15 int num1 = 0, num2 = 0; 16 for(i = l; i <= r; ++i){ 17 if(L[num1] <= R[num2]) A[i] = L[num1++]; 18 else{ 19 A[i] = R[num2++]; 20 sum += mid-l-num1+1; 21 } 22 } 23 } 24 void solve(int A[], int l, int r){ 25 if(l < r){ 26 int mid = (l+r) >> 1; 27 solve(A, l, mid); 28 solve(A, mid+1, r); 29 d(A, l, mid, r); 30 } 31 } 32 int main(){ 33 scanf("%d", &n); 34 for(int i = 0; i < n; ++i){ 35 scanf("%d", &a[i]); 36 } 37 solve(a, 0, n-1); 38 printf("%lld\n", sum); 39 return 0; 40 }
------------------------------------------------------------------------
------------------------------------------------------------------------
------------------------------------------------------------------------
------------------------------------------------------------------------