關於前端框架Layui使用Ajax實現分頁模糊查詢的操作
阿新 • • 發佈:2021-01-12
歸併排序
給定你一個長度為n的整數數列。
請你使用歸併排序對這個數列按照從小到大進行排序。
並將排好序的數列按順序輸出。
輸入格式
輸入共兩行,第一行包含整數 n。
第二行包含 n 個整數(所有整數均在 1 − 1 0 9 1-10^9 1−109範圍內),表示整個數列。
輸出格式
輸出共一行,包含 n 個整數,表示排好序的數列。
資料範圍
1 ≤ n ≤ 100000 1≤n≤100000 1≤n≤100000
輸入樣例:
6
3 1 6 2 4 5
輸出樣例:
1 2 3 4 5 6
#include <bits/stdc++.h>
using namespace std;
//
int a[100005];
//
void merge_sort(int *arr,int b,int e)
{
if(b>=e) return;
int mid = (b+e)>>1; //取中點
merge_sort(arr,b,mid); //遞迴排右邊
merge_sort(arr,mid+1,e); //左邊
//歸併
int *slot = new int[e-b+1]; //申請堆區空間
memset(slot,0,sizeof(slot));
int i=b , j=mid+1 , k=0;
while(i <= mid && j<=e)
{
if(arr[i] < arr[j])
slot[k++] = arr[i++];
else
slot[k++] = arr[j++];
}
int begin = i , end = mid; //假設左邊未完全插入到slot[]中的元素區間
if(i>mid) //如果左邊全部在slot[]中 ,那麼就將begin和end指向右邊的未插入的元素區間
{
begin = j;
end = e;
}
while(begin <= end) slot[k++] = arr[begin++]; //將begin 和 end 區間內的元素放到slot[]中
for(int i=0;i<k;i++)
arr[b+i] = slot[i];
//釋放記憶體
delete[] slot;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
merge_sort(a,0,n-1);
for(int i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
}
問題應用
給定一個長度為n的整數數列,請你計算數列中的逆序對的數量。
逆序對的定義如下:對於數列的第 i 個和第 j 個元素,如果滿足 i < j 且 a[i] > a[j],則其為一個逆序對;否則不是。
輸入格式
第一行包含整數n,表示數列的長度。
第二行包含 n 個整數,表示整個數列。
輸出格式
輸出一個整數,表示逆序對的個數。
資料範圍
1 ≤ n ≤ 100000 1≤n≤100000 1≤n≤100000
輸入樣例:
6
2 3 4 5 6 1
輸出樣例:
5
AC程式碼:(歸併排序的思想)
#include <bits/stdc++.h>
using namespace std;
//
int a[100005];
int n;
//
long long merge_sort(int *arr,int b,int e)
{
if(b>=e) return 0;
int mid = b + e >> 1;
long long ans = merge_sort(arr,b,mid) + merge_sort(arr,mid+1,e);
//歸併
int *slot = new int[e-b+1];
int i=b , j=mid+1 , k=0;
while( i<=mid && j<=e)
{
if(arr[i] <= arr[j])
slot[k++] = arr[i++];
else //如果arr[i] > arr[j] 那麼在 i~mid 的所有元素都大於arr[j] 那麼ans就加上 mid-i+1
{
slot[k++] = arr[j++];
ans += mid-i+1;
}
}
while(i<=mid) slot[k++] = arr[i++];
while(j<=e) slot[k++] = arr[j++];
for(int i=0;i<k;i++)
arr[b+i] = slot[i];
delete[] slot;
return ans;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
cout<<merge_sort(a,0,n-1)<<endl;
return 0;
}