排序算法

 1  void DirectInsertionSort::SortAlgorithmi(int array[], int n){
 2     //实现直接插入排序-升序
 3     int i, j;
 4      for(i=1; i<n; i++){
 5         int temp = array[i];  //保存需插入有序区的元素
 6         for(j=i-1; j>=0 && temp < array[j]; j--){
 7            array[j+1] = array[j];  //不满足要求(比较元素比它大(小)),被比较的元素依次往后移
 8          }
 9        array[j+1] = temp; //当满足条件时,插入到比它小(大)或等于它的元素后面;或者它就是最小的元素时,排在最前位
10      }
11 }
12 time and space complexity:O(n2)   O(1)    
13 稳定排序
    cout << "直接插入排序算法描述:" << endl;
    cout << "1.整个序列分为有序区(第一个元素)和无序区;" << endl;
    cout << "2.从无序区中拿一个元素与有序区从后往前依次比较,(被比较的元素依次往后移)直到满足条件 则插入到有序区该位置;" << endl;
    cout << "3.重复2的步骤,,直到无序区最后一个元素完成排序."<<endl;

 

 
  
 
  
 1 void BubbleSort::SortAlgorithmi(int array[], int n){
 2     //冒泡排序 - 升序
 3     int i, j;
 4     int k;
 5     for(i=0; i<n-1; i++){
 6         k = i;  //i为选取的元素的下标 , k为记录最大元素的下标
 7         for(j=i+1; j<n;j++){
 8             if(array[k] > array[j]){ //拿最大的(array[k])与没比较的比较
 9                 k = j;  //记录大的元素的位置下标
10             }
11         }
12         if(k != i){//选取的元素不是最大的元素
13             int temp = array[i];
14             array[i] = array[k];
15             array[k] = temp;
16         }
17     }
18 }
time and space complexity:O(n2)   O(1)    
稳定排序
 
  
    cout << "冒泡排序算法描述:" << endl;
    cout << "1.整个序列分为有序区(无元素)和无序区;" << endl;
    cout << "2.找出无序区中最大(小)元素:选取无序区中的第一个元素下标为i与无序区的其他所有元素比较,\n"
            "若其他元素比选取的元素大,记录大(小)的元素的位置,直到所有元素比较完,交换下标为i与最大元素两者的位置," << endl;
    cout << "3.经过一趟后无序区中最大(小)的元素就排在无序区最前面即有序区,然后重复2"<<endl;
 
  
 1 void QuickSort::quickSort(int array[], int left, int right){
 2     if(left > right)
 3         return;
 4     int iSentry = left;
 5     int jSentry = right;
 6     int pivot = array[left];
 7     while(iSentry < jSentry)
 8     {
 9         //先从右边开始找小于temp的元素  注意等号
10         while (iSentry < jSentry  && pivot <= array[jSentry]) {
11             jSentry--;
12         }
13         //再从左边开始找大于temp的元素
14         while (iSentry < jSentry  && pivot >= array[iSentry]){
15             iSentry++;
16         }
17 
18         //两哨兵未相遇,交换小于temp和大于temp的元素
19         if(iSentry < jSentry)
20         {
21             int temp = array[iSentry];
22             array[iSentry] = array[jSentry];
23             array[jSentry] = temp;
24         }
25         //继续
26     }
27     //两哨兵相遇,将基准数归位,此时基准数左边的数均小于基准数,右边的数均大于基准数
28     array[left] = array[jSentry];
29     array[jSentry] = pivot;
30 
31     //递归处理基准左边未排序的数
32     /*QuickSort::*/quickSort(array, left, iSentry-1);
33     //递归处理基准右边未排序的数
34     /*QuickSort::*/quickSort(array, iSentry+1, right);
35 
36 }
37 
38 void QuickSort::SortAlgorithmi(int array[], int n){
39     int left = 0, right = n-1;
40     /*QuickSort::*/quickSort(array, left, right);
41 }
time and space complexity :O(n2)  O(nlog2n)
不稳定排序
    cout << "快速排序算法描述:" << endl;
    cout << "1.首先选一个轴值(pivot,也有叫基准的),将待排序记录划分成独立的两部分;" << endl;
    cout << "2.左侧的元素均小于轴值,右侧的元素均大于或等于轴值;" << endl;
    cout << "3.然后对这两部分再重复,直到整个序列有序,过程是和二叉搜索树相似,就是一个递归的过程"<<endl;

 1 void HeapSort::Heapify(int arr[], int first, int end)
 2 {
 3     int father = first;
 4     int son = father*2+1;
 5     while(son < end){
 6         //如果存在两个子节点,则son等于较大字节的的下标
 7         if(son+1 < end && arr[son] < arr[son+1])son++;
 8 
 9         //如果父节点大于大的子节点则表示调整完毕
10         if(arr[father] > arr[son])
11             break;
12         else{
13             //不然就交换父节点和子节点的元素
14             int temp = arr[father];
15             arr[father] = arr[son];
16             arr[son] = temp;
17             //父和子节点变成下一个要比较的位置
18             father = son;
19             son = 2 * father + 1;
20         }
21     }
22 }
23 
24 void HeapSort::SortAlgorithmi(int array[], int n){
25     int i;
26     //初始化堆,从最后一个父节点开始
27     for(i = len/2 - 1; i >= 0; --i){
28         Heapify(arr,i,len);
29     }
30     //从堆中的取出最大的元素再调整堆
31     for(i = len - 1;i > 0;--i){
32         int temp = arr[i];
33         arr[i] = arr[0];
34         arr[0] = temp;
35         //调整成堆
36         Heapify(arr,0,i);
37  }
time and space complexity:O(nlog2n)   O(1) 
不稳定排序

 

 

 

2018-09-19

posted on 2018-09-19 19:24 lMimjx 阅读( ...) 评论( ...) 编辑 收藏
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值