zoukankan      html  css  js  c++  java
  • 数据结构七大排序

      1 //
      2 //  main.cpp
      3 //  sort
      4 //
      5 //  Created by tsw on 15/8/8.
      6 //  Copyright (c) 2015年 tsw. All rights reserved.
      7 //
      8 
      9 #include <iostream>
     10 using namespace std;
     11 
     12 
     13 
     14 void print(int arr[],int num){
     15     for (int i=0; i < 9; i++) {
     16         cout<<arr[i]<<" ";
     17     }
     18     cout<<"end"<<endl;
     19 }
     20 
     21 //冒泡排序
     22 void msort(int arr[],int num){
     23     int i,j,temp;
     24     for (i = 0; i< num; i++ ) {
     25         for(j = num-1 ; j>= i;j--){
     26             if(arr[j] < arr[j-1]){
     27                 temp = arr[j-1];
     28                 arr[j-1] = arr[j];
     29                 arr[j] = temp;
     30             }
     31         }
     32     }
     33 }
     34 
     35 //直接插入排序
     36 void insert_sort(int arr[] , int num){
     37     int i,j ,temp;
     38     for(i= 1;i < num ;i++){
     39         //cout<<arr[i]<<endl;
     40         if(arr[i] < arr[i-1]){
     41             
     42             temp = arr[i];
     43             for (j=i-1; arr[j] > temp; j--) {
     44                 arr[j+1] = arr[j];
     45             }
     46             arr[j+1] = temp;
     47         }
     48     }
     49 }
     50 
     51 
     52 // 归并排序
     53 void marge(int sr[],int tr1[],int i,int m,int num){
     54     int j,k,l;
     55     k = i;
     56     j = m+1;
     57     for (;i <= m && j<=num; k++) {    //左边和右边进行比较
     58         if (sr[i]<sr[j]) {
     59             tr1[k] = sr[i++];
     60         }else{
     61             tr1[k] = sr[j++];
     62         }
     63     }
     64     if (i<=m) {  //如果左边没有加完则将左边全部加进去
     65         for (l = 0; l <= m-i; l++) {
     66             tr1[k+l] = sr[i+l];
     67         }
     68     }
     69     if (j<=num) {//如果右边没有加完则将右边全部加进去
     70         for (l=0; l<=num-j ; l++) {
     71             tr1[k+l] = sr[j+l];
     72         }
     73     }
     74 }
     75 
     76 // 归并排序
     77 void gb_sort(int sr[],int tr1[],int s,int num){
     78     int m;
     79     int tr2[10];
     80     if (s==num) {//递归退出条件
     81         tr1[s]=sr[s];
     82     }else {
     83         m = (s+num)/2;  //找到中间下标
     84         gb_sort(sr,tr2,s,m); //将左边添加到数组里边
     85         gb_sort(sr,tr2,m+1, num);//将右边添加到数组里边
     86         marge(tr2,tr1,s,m,num); //将左边和右边进行排序
     87     }
     88 }
     89 
     90 void swap(int arr[],int a,int b){
     91     int temp;
     92     temp = arr[a];
     93     arr[a] = arr[b];
     94     arr[b] = temp;
     95 }
     96 
     97 int part(int arr[],int low,int high){
     98     
     99     int m,temp;
    100     m = low+(high-low)/2;   // 以下为三次取中
    101     if (arr[low]>arr[high]) {
    102         swap(arr,low,high);
    103     }
    104     if (arr[m]>arr[high]) {
    105         swap(arr,m,high);
    106     }
    107     if (arr[m]>arr[low]) {
    108         swap(arr,low,m);
    109     }// 以下为三次取中
    110     temp = arr[low];
    111     
    112     while (low<high) {
    113         while (arr[high]>=temp && low < high) {
    114             high--;    //如果arr[high]大于中间值的话  high向后移动一位
    115         }
    116         arr[low] = arr[high];  //用后边的值去覆盖前边的值
    117         
    118         while (arr[low] <= temp && low < high) {
    119             low++;
    120         }
    121         arr[high] = arr[low];
    122         
    123     }
    124     arr[low] = temp;
    125 
    126     
    127     return low;
    128 }
    129 
    130 
    131 
    132 void fast_sort(int arr[],int low ,int high){
    133     
    134     int p;
    135     while(low<high) {  //或者用if
    136         p = part(arr,low,high);
    137         fast_sort(arr, low , p - 1);
    138         low = p + 1;
    139         //fast_sort(arr, p + 1 , high);
    140     }
    141 }
    142 
    143 
    144 
    145 
    146 //堆排序
    147 
    148 void adjust(int arr[],int s,int m){
    149     int temp,i;
    150     temp = arr[s];
    151     
    152     for ( i = 2 * s +1 ; i <= m; i =i * 2+1) {  //当数组是从0开始的二叉树的结构将是 0 1 2 3 4 5 6 7 8   0对应的两个子树为 1和 2; 1对应的两个子树为3和4 一次类推
    153         if (i < m && arr[i] < arr[i+1]) {   //判断左孩子节点是否小于右孩子节点,小于的话将i志向右孩子节点
    154             i++;
    155         }
    156         if (temp >= arr[i]) {   //如果根节点大于或等于两个子节点则不用改变
    157             break;
    158         }
    159         arr[s] = arr[i];
    160         s = i;
    161     }
    162     arr[s] = temp;
    163 }
    164 
    165 
    166 void d_sort(int arr[],int num){
    167     int i , temp;
    168     for (i = num/2-1; i >= 0 ; i--) {
    169         adjust(arr,i,num-1);
    170         print(arr, 9);
    171         
    172     }
    173     cout<<"buile end"<<endl;
    174     for (i = num-1; i >= 0; i--) {
    175         temp = arr[i];
    176         arr[i] = arr[0];
    177         arr[0] = temp;
    178         adjust(arr,0,i-1);   // 必须是i-1 ,因为当上一次交换过之后最大的值已经放到最后了,所以不用再进行交换了
    179         print(arr, 9);
    180     }
    181 }
    182 
    183 
    184 void shell_sort(int arr[],int num){
    185     int incriment = num-1;
    186     int i , temp , j;
    187     do{
    188         incriment = incriment/3;  //跳跃值的不同,排序的次数也不同
    189         for (i = incriment; i < num; i++) {
    190             if (arr[i] < arr[i-incriment]) {
    191                 temp = arr[i];
    192                 for (j = i - incriment; j >= 0 && arr[j] > temp ; j-=incriment) {  //循环判断当前值是否小与前一个位置的值,如果小与则替换
    193                     arr[j+incriment] = arr[j];
    194                 }
    195                 arr[j+incriment] = temp;
    196             }
    197         }
    198         print(arr, 9);
    199         
    200     }while (incriment>1);  //跳跃值不能为1否则将会进入死循环
    201 }
    202 
    203 
    204 
    205 
    206 int main(int argc, const char * argv[]) {
    207     // insert code here...
    208     int arr[] = {3,4,12,8,6,2,9,7,1};//{50,10,90,30,70,40,80,60,20};//
    209     //msort(arr, 9);
    210     //insert_sort(arr, 9);
    211     //gb_sort(arr, arr, 0, 9-1);
    212     //fast_sort(arr, 0, 8);
    213     //d_sort(arr,9);
    214     shell_sort(arr, 9);
    215     print(arr, 9);
    216     std::cout << "Success
    ";
    217     return 0;
    218 }
  • 相关阅读:
    CentOS安装配置ganglia
    k-means聚类算法
    SharePoint solution and feature management with PowerShell
    EM算法
    极客”一词,来自于美国俚语“geek”的音译,一般理解为性格古怪的人
    学习游戏要学习编程语言吗?十大主流编程语言解析
    platform_device与platform_driver
    《用户体验要素》澄清了 UI 原型设计中看不见确感受得到的那一层
    ipconfig /flushdns 清除系统DNS缓存
    typedef和define具体的具体差别
  • 原文地址:https://www.cnblogs.com/tianshuowang/p/4722439.html
Copyright © 2011-2022 走看看