基本算法(一)-插入排序 InsertSort的C++实现

    插入排序是最直接的排序方式之一,Algorithms.4 中举例为抓扑克牌时,从左到右将最小的扑克牌放置在最左,依次进行。

void vInsertSort(vector<int> &nums){
	int len = nums.size();
	int temp;
	for(int i=0; i<len-1; i++){     // i从第一个到倒数第二个
		for(int j=i+1; j<len; j++){    // j从i后一个到最后一个,即遍历无序区
			if(nums[j]<nums[i]){   // 不断交换,最终每个i处都是第i小的数
				temp = nums[j];
				nums[j] = nums[i];
				nums[i] = temp;
			}
		}
	}
}

具体实现方法多种多样,针对这段code,注意到i从0->length-1,即在倒数第二个即完成。如果为i<len,会导致j=i+1越界。(也可以使得j=i开始防止错误。上述code只是我因为这是最易于直观理解的写法,即每个元素i开始,与之后的所有元素比较并适时交换)。

完整的(更啰嗦的)代码见下:

#include <iostream>
#include <vector>

using namespace std;

// 迭代vector输出每个元素
void coutAll(vector<int> &nums){
    vector<int>::iterator it;
    for(it=nums.begin(); it!=nums.end(); it++)
        cout<<*it<<" ";
    cout<<endl<<endl;;
}


// 返回排序的数组并且不改变原数据
vector<int> InsertSort(vector<int> &nums){

    vector<int> sortedNum(nums);
	int len = sortedNum.size();
	int temp;
	for(int i=0; i<len-1; i++){     // i只从0到倒数第二个位置遍历即可。
		for(int j=i+1; j<len; j++){     // j从i往后开始遍历
		    // bool ii = sortedNum[j] < sortedNum[i];
            // cout<<sortedNum[j]<<" less "<<sortedNum[j-1]<<" is "<<ii<<endl; // 输出每次比较的情况
			if(sortedNum[j]<sortedNum[i]){   // 交换,最终使得余下最小的数处于i处
				temp = sortedNum[j];
				sortedNum[j] = sortedNum[i];
				sortedNum[i] = temp;
			}
        // coutAll(sortedNums);
		}
	}
	cout<<endl<<"Insert Sorted nums:"<<endl;
	coutAll(sortedNum); // 输出排序后的结果

	return sortedNum;
}

// 对nums排序
void vInsertSort(vector<int> &nums){
	int len = nums.size();
	int temp;
	for(int i=0; i<len-1; i++){     // i只从0到倒数第二个位置遍历即可。
		for(int j=i+1; j<len; j++){     // j从i往后开始遍历
			if(nums[j]<nums[i]){   // 交换,最终使得余下最小的数处于i处
				temp = nums[j];
				nums[j] = nums[i];
				nums[i] = temp;
			}
		}
	}
}


int main()
{
	int num7[7] = {2, 1, 5, 22, 13, -4, 5};
	vector<int> nums(&num7[0], &num7[6]);

	cout<<"Original nums: "<<endl;
	coutAll(nums);

	vector<int> sortedNum = InsertSort(nums); // 此处得到排序数组sortedNum,且不改变nums的原来的值

    cout<<"Original nums: "<<endl;
    coutAll(nums);

    vInsertSort(nums);  // 该种方法即直接对nums排序
    cout<<"Original nums after vInsertSort(nums): "<<endl;
    coutAll(nums);

	return 0;
}

包含了InsertSort和vInsertSort,前者带返回值,返回一个排序数组且不改变原数组,另一种不用新建数组的方法即传参时传入vector<int> nums,但是耗时会多几倍。后者无返回值,直接对数组排序。具体见运行结果。




猜你喜欢

转载自blog.csdn.net/weixin_38628152/article/details/79760829