【數據結構】---排序1

冒泡排序

void BubbleSort(int arr[],int n){
    if(n==1||n==0) return;
    for(int e=n-1;e>0;e--){
        for(int i=0;i<e;i++){
            if(arr[i]>arr[i+1])
                swap(arr,i,i+1);
        }
    }
}
void swap(int arr[],int i,int j){
    arr[i]=arr[i]^arr[j];
    arr[j]=arr[i]^arr[j];
    arr[i]=arr[i]^arr[j];
}

插入排序

void InsertSort(int arr[],int n){
    if(n==1||n==0) return;
    for(int i=1;i<n;i++){
        for(int j=i-1;j>=0&&arr[j]>arr[j+1];j--)
        swap(arr,j,j+1);
    }
}   

選擇排序

void SelectSort(int arr[],int n){
    if(n==1||n==0) return;
    for(int i=0;i<n-1;i++){
        int minIndex=i;
        for(int j=i+1;j<n;j++){
            minIndex=arr[j]<arr[minIndex]?j:minIndex;
        }
        swap(arr,i,minIndex);
    }
}

歸併排序

void mergeSort(int arr[],int l,int r){
    if(l==r) return;
    int mid=l+((r-l)>>1);//防止溢出,>>代表右移一位
    mergeSort(arr,l,mid);
    mergeSort(arr,mid+1,r);
    merge(arr,l,mid,r);
}
void merge(int arr[],int l,int m,int r){
    int help[MAXSIZE];
    int i=0,p1=l,p2=m+1;
    while(p1<=m&&p2<=r)
        help[i++]=arr[p1]<arr[p2]?arr[p1++]:arr[p2++];
    while(p1<=m)
        help[i++]=arr[p1++];
    while(p2<=r)
        help[i++]=arr[p2++];
    for(i=0;i<sizeof(help)/sizeof(int);i++)
        arr[l+i]=help[i];
}

快速排序
**要取得[a,b)的隨機整數,使用(rand() % (b-a))+ a;
要取得[a,b]的隨機整數,使用(rand() % (b-a+1))+ a;
要取得(a,b]的隨機整數,使用(rand() % (b-a))+ a + 1;
通用公式:a + rand() % n;其中的a是起始值,n是整數的範圍。
要取得a到b之間的隨機整數,另一種表示:a + (int)b * rand() / (RAND_MAX + 1)。
要取得0~1之間的浮點數,可以使用rand() / double(RAND_MAX)。**

void QuickSort(int arr[],int l,int r){
    if(l<r){
    swap(arr,(rand() % (r-l))+ l),r);//隨機找到一個數,交換到隊尾,防止出現badcase:1 2 3 4 5 6這種情況
    int  p[2]=partition(arr,l,r);
    quickSort(arr,l,p[0]-1);
    quickSort(arr,p[1]+1,r);
   }
}
int partition[](int arr[],int l,int r){
    int less=l-1;
    int more=r;
    while(l<more){
        if(arr[l]<arr[r])
            swap(arr,++less,l++);
        else if(arr[l]>arr[r])
            swap(arr,--more,l);
        else
            l++;
    }
    swap(arr,more,r);//將選出的part值和大於區的隊頭交換
    int p[2];
    p[0]=less+1;
    p[1]=more;
    return p;
}

注:在不申請額外空間的情況下,是很難實現將一個數組中的奇數和偶數分開,並且保持相對順序不變。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章