PAT1098【插入排序+堆排序】
生活随笔
收集整理的這篇文章主要介紹了
PAT1098【插入排序+堆排序】
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
簡單插入排序:
簡單插入排序的核心思想:
把一條這么個難看的序列默認(rèn)分為兩個排好序的和未排好序的兩個部分;
所以一開始排好序的只有一個a[0](好看的只有一個),難看的有N(數(shù)組長度)-1個a[1,n-1];
然后呢,你就要順序下來,把一個個難看的幾個人插到好看的那一堆里去,好看的越來越多,難看的越來越少,最后變成了真的好看的;
代碼:
void InsertionSort(int a[],int n) //a[]是要處理的數(shù)組,n是數(shù)組長度 {int i,j;int temp;//默認(rèn)兩部分,一部分好看,一部分難看;//把難看的解決就好了 for(i=1;i<=n-1;i++) //有n-1個難看的{temp=a[i];for(j=i-1;j>=0;j--) {if(a[j]<temp) //這個難看孩子在好看的位置,就是前面那個比他小的時候break;a[j+1]=a[j];}a[j+1]=temp; //比他小的好看孩子的后面一個啊;就算最小的還比他大,j傳出來會變成-1,j+1就是0了 } }
堆排序:
堆排序的思想:
利用最大堆(最小堆)輸出堆頂元素,即最大值(或最小值),將剩下的元素重新生成最大堆(或者最小堆),一直重復(fù)這個過程,直到所有的元素輸出。
我們來學(xué)習(xí)一個開辟O(1)空間就能辦事的堆排序。
其實很簡單,就是把最大堆(或者最小堆)與它最后一個元素交換,然后重新建立最大堆。
代碼主要做的事情就是:“向下過濾”,所以我們把這部分代碼拿出來。
void Adjust(int a[], int i, int n) { int c,temp; for(temp=a[i];(2*i+1)<n;i=c) { c=2*i+1; if(c!=n-1&&a[c+1]>a[c]) c=c+1; if(temp<a[c]) a[i]=a[c]; else break; } a[i] = temp; }
然后開始寫堆排序的步驟代碼:
void Build(int a[],int n) {for(int i=(n-1)/2;i>=0;i--)//從有兒子的最后一個結(jié)點開始向下過濾 Adjust(a,i,n); }
然后就是一個交換:
void Exchange(int a[],int n) {for(i = n - 1; i > 0; i--){temp = a[0];a[0] = a[i];a[i] = temp;//交換Adjust(a, 0, i);//將交換的新a[0]向下過濾一下得到最大堆} }
題目代碼:
#include<bits/stdc++.h> using namespace std; typedef long long LL; const int MAXN=1e2+10;bool Check(int a[],int b[],int n) {for(int i=0;i < n;i++)if(a[i]!=b[i]) return false;return true; }//第 i 個元素向下過濾; void Adjust(int a[], int i, int n) {int c,temp;for(temp=a[i];(2*i+1)<n;i=c){c=2*i+1;if(c!=n-1&&a[c+1]>a[c])c=c+1;if(temp<a[c]) a[i]=a[c];else break;}a[i] = temp; }bool HeapSort(int a[], int n,int b[]) {int c,i,temp;//建立最大堆 for(i = (n-1)/2; i >= 0; i--) //從含有兒子節(jié)點的根開始。 Adjust(a, i, n);//然后依次交換。 for(i = n - 1; i > 0; i--){temp = a[0];a[0] = a[i];a[i] = temp;Adjust(a, 0, i);if(Check(a,b,n)){i--;temp = a[0];a[0] = a[i];a[i] = temp;Adjust(a, 0, i); puts("Heap Sort");for(int k=0;k<n;k++){if(k) printf(" ");printf("%d",a[k]);}return true;}}return false; }bool InsertionSort(int a[],int b[],int n) {int temp,i,j;for(i=1;i<=n-1;i++){temp=a[i];for(j=i-1;j>=0;j--){if(a[j]<temp) break;a[j+1]=a[j];}a[j+1]=temp;if(Check(a,b,n)){i++; temp=a[i];for(j=i-1;j>=0;j--){if(a[j]<temp) break;a[j+1]=a[j];}a[j+1]=temp;puts("Insertion Sort");for(int k=0;k<n;k++){if(k) printf(" ");printf("%d",a[k]);}return true;}}return false; }int main() {int n;int a[MAXN],b[MAXN],c[MAXN];scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d",&a[i]);c[i]=a[i];}for(int i=0;i<n;i++)scanf("%d",&b[i]);if(InsertionSort(a,b,n))return 0;if(HeapSort(c,n,b))return 0; }轉(zhuǎn)載于:https://www.cnblogs.com/keyboarder-zsq/p/6777372.html
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的PAT1098【插入排序+堆排序】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [一天一个小知识]instanceof
- 下一篇: C# 导出dataGridView中的值