Esempio n. 1
0
/*
 ---------------------直接选择排序----------------------
   初始关键字: 9 8 7 6 5 4 3 2 1
   i = 1     1 8 7 6 5 4 3 2 9
   i = 2     1 2 7 6 5 4 3 8 9
   i = 3     1 2 3 6 5 4 7 8 9
   i = 4     1 2 3 4 5 6 7 8 9

  直接选择排序算法是从数组无序区域第一个位置元素开始,和该位置元素为标准,不断的寻找最小的元素位置,然后让该
 元素和最小的元素位置进行交换.加入到有序的区域内。
 */
void Sort::selectSort(RecType *R, int n)
{
    traverseArray(R, n);

    int k = 0;//最小记录的元素位置
    RecType tmp;
    for (int i = 0; i < n - 1; i++)
    {
        k = i;//最小元素位置设为当前的位置
        for (int j = i + 1; j < n; j++)
        {
            if (R[j].key < R[k].key)
            {
                k = j;//最小位置改变
            }
        }
        
        //最后当前位置和最小位置的值进行交换
        //i = k代表就是这个位置已经是正确的了
        if (i != k)
        {
            tmp = R[k];
            R[k] = R[i];
            R[i] = tmp;
        }
    }
    
    traverseArray(R, n);
}
Esempio n. 2
0
/*
   ---------------------冒泡排序----------------------
   初始关键字 9 8 7 6 5 4 3 2 1
   i = 1    1 9 8 7 6 5 4 3 2
   i = 2    1 2 9 8 7 6 5 4 3
   i = 3    1 2 3 9 8 7 6 5 4
   i = 4    1 2 3 4 9 8 7 6 5
   i = 5    1 2 3 4 5 9 8 7 6
   i = 6    1 2 3 4 5 6 9 8 7
   i = 7    1 2 3 4 5 6 7 9 8
   i = 8    1 2 3 4 5 6 7 8 9
 
   冒泡排序算法是属于交换算法,首先先从初始关键字数组种的底部开始,对两个数进行比较.如果顺序不对就进行交换,否则不动.
 现在以 i = 1作为例子.
   循环如下:
   1和2对比 1小2大 交换 此时 数组是这样的 9 8 7 6 5 4 3 1 2
   然后 3 1对比 同理 9 8 7 6 5 4 1 3 2
   然后 4 1对比 9 8 7 6 5 1 4 3 2
   下面都是这样道理,只要1交换到最前面就是 i = 1的那个结果了.原理就是这样.
 */
void Sort::bubbleSort(RecType *R, int n)
{
    traverseArray(R, n);
    
    RecType tmp;
    int hasChanges = 0; //是否有过交换
    
    for (int i = 0; i < n - 1; i++)
    {
        for (int j = n - 1; j > i; j--)
        {
            hasChanges = 0;//没有过交换
            if (R[j - 1].key > R[j].key)
            {
                //数据交换
                tmp = R[j];
                R[j] = R[j - 1];
                R[j - 1] = tmp;
                
                hasChanges = 1;
            }
        }
        
        //代表本次循环中没有过任何数据交换,就不用继续比较了
        if (hasChanges == 0) {
            break;
        }
    }
    
    traverseArray(R, n);
}
Esempio n. 3
0
void Sort::insertSort_Shell(RecType *R, int n)
{
    traverseArray(R,n);
    //初始增量
    int d = n/2;
    //增量大于1
    while (d >= 1)
    {
        shell_sort(R, d, n);
        d = d/2;
    }
    traverseArray(R,n);
}
Esempio n. 4
0
/*
    二分法插入排序算法其实和普通的插入排序算法最大区别就是,因为普通的插入排序算法将元素一一比较然后
 插入在有序区域里面.所以在有序区域里面插入可以利用二分法来插入不用一个一个比较.提高效率
 */
void Sort::insertSort_dichotomy(RecType R[], int n)
{
    std::cout<<"+++++二分法插入排序算法函数测试+++++"<<std::endl;
    traverseArray(R,n);
    
    int low,high,mid;//二分法最低位/最高位/中间位置
    RecType tmp;
    
    for (int i = 1; i < n; i++)
    {
        tmp = R[i];
        
        low = 0;
        high = i - 1;
        
        //二分法遍历,low大于high时候退出循环 此high位置是比前面一个数要小
        while(low <= high)
        {
            //开始循环之前找中间位置
            mid = (low + high) / 2;
            
            //该数目比中间数小(在左边)
            //该数目比中间数大或者等于(在右边)
            //记住新区间不包括中间的位置
            if (tmp.key < R[mid].key )
            {
                high = mid - 1;
            }
            else
            {
                low = mid + 1;
            }
        }
        
        //移动元素,用二分法确定元素位置后
        for (int j = i - 1; j >= high + 1; j--) {
            R[j + 1] = R[j];
        }
        R[high + 1] = tmp;
    }
    
    traverseArray(R, n);
}
Esempio n. 5
0
void Sort::heapSort(RecType R[], int n)
{
    traverseArray(R, n);
    
    //建立初始堆(只是必须要的)
    for (int i = n - 1; i >= 0; i--)
    {
        sift(R, i, n);
    }
    
    int last = n - 1;//最后面一个节点
    for (int i = 1; i <= n;i++,last--)
    {
        RecType temp = R[0];
        R[0] = R[last];
        R[last] = temp;
        sift(R, 0, last);
    }
    
    traverseArray(R, n);
}
Esempio n. 6
0
/*
    ------------------插入排序----------------------
    初始关键字 9 8 7 6 5 4 3 2 1
    第一次循环 i = 1 [8 9] 7 6 5 4 3 2 1 将8插入9前面
    第二次循环 i = 2 [7 8 9] 6 5 4 3 2 1 将7插入8前面
    第三次循环 i = 3 [6 7 8 9] 5 4 3 2 1 将6插入7前面
    第四次循环 i = 4 [5 6 7 8 9] 4 3 2 1     *
    第五次循环 i = 5 [4 5 6 7 8 9] 3 2 1     *
    第六次循环 i = 6 [3 4 5 6 7 8 9] 2 1     *
    第七次循环 i = 7 [2 3 4 5 6 7 8 9] 1     *
    第八次循环 i = 8 [1 2 3 4 5 6 7 8 9] 将1插入2前面
 
    插入排序算法主要分为有序区域和无序区域,将需要进行排序的数组归为无序区域,将排序结束后的区域
 称为有序区域.插入算法的基本思想就是从无序区域取出第一个值放入有序区域内,然后在无序区域从左到右
 取第二值开始,不断的和有序区域内的元素比较(我这里是从右到左,就是从大到小),所以比较的出如果目前
 的值如果比有序区域内的元素值大就放在该元素左边,否则一直往左边移动,不断比较.
 */
void Sort::insertSort(RecType R[], int n)
{
    std::cout<<"+++++插入排序算法函数测试+++++"<<std::endl;
    traverseArray(R, n);
    
    RecType tmp;//用于临时存储
    for (int i = 1; i < n; i++)
    {
        tmp = R[i]; //取需要比较的变量
        //在有序区域内循环比较
        for (int j = i - 1; j >= 0; j--)
        {
            if (tmp.key < R[j].key)
            {
                //数据往前移动
                R[j + 1] = R[j];
                R[j] = tmp;
            }
        }
    }
    
    traverseArray(R, n);
}
Esempio n. 7
0
void test_asArray(){
  LinkedList list = createList();
  void *item = (int *)malloc(sizeof(int));
  *(int *)item = 10;
  int length = add_to_list(&list, item);
  void *item1 = (int *)malloc(sizeof(int));
  *(int *)item1 = 11;
  length = add_to_list(&list, item1);
  void *item2 = (int *)malloc(sizeof(int));
  *(int *)item2 = 12;
  length = add_to_list(&list, item2);
  void *item3 = (char *)malloc(sizeof(char));
  *(char *)item3 = 13;
  length = add_to_list(&list, item3);
  
  void *array[4];
  int maxItems = 4;

  int no_of_elements = asArray(list, array,maxItems);
  assert(no_of_elements == 4);
  traverseArray(list, array, maxItems);
  printf("Items are inserted into the given array\n");
}
Esempio n. 8
0
void Sort::quickSort(RecType *R, int n)
{
    traverseArray(R, n);
    quick_sort(R, 0, n - 1);
    traverseArray(R, n);
}