排序思路:每次将一个待排序的元素与已排序的元素进行逐一比较,直到找到合适的位置按大小排序。
插入排序:时间复杂度O(n^2)
直接插入排序是属于In-place sort(不占用额外内存或占用常数的内存),所以空间复杂度为O(1)。
#include <iostream>
using namespace std;
//升序
void insertSort_0(int arr[], int length){
int i,j,key;
for (i = 0; i < length; i++)
{
key=arr[i];//从第一个元素开始,该元素可以认为已经被排序
for (j =i-1; j >=0; j--)//取出下一个元素,在已经排序的元素序列中从后向前扫描
{
if (arr[j]>key)//如果该元素(已排序)大于新元素(key),将该元素移到下一位置
{
arr[j+1]=arr[j];
}
else
break;
}
arr[j+1]=key;//直到找到已排序的元素小于或者等于新元素的位置,将新元素插入到该位置后
}
}
//降序
void insertSort_1(int arr[], int length){
int i,j,key;
for (i = 0; i < length; i++)
{
key=arr[i];
for (j =i-1; j >=0; j--)
{
if (arr[j]<key)//7<8(注意:升序和降序只改这一处)
{
arr[j+1]=arr[j];//将7移到下一个位置
}
else
break;
}
arr[j+1]=key;//直到找到已排序的元素大于或者等于新元素的位置,将新元素插入到该位置后
}
}
int main()
{
int iArr[] = { 7, 8, 9, 5, 2, 0, 12, 6 };
int len = sizeof iArr / sizeof(iArr[0]);
cout << "排序前:";
for (int i = 0; i < len; i++) {
cout << iArr[i] << " ";
}
cout << "\n升序排序后:";
insertSort_0(iArr, len);
for (int j = 0; j < len; j++) {
cout << iArr[j] << " ";
}
cout << "\n降序排序后:";
insertSort_1(iArr, len);
for (int k = 0; k < len; k++) {
cout << iArr[k] << " ";
}
cout << endl;
system("pause");
return 0;
}
选择直接插入排序进行去重排序
int main()
{
//int iArr[] = { 7,7, 8, 9, 5, 2,2, 0, 12, 6 };
//int len=10;
//7 7 8 9 5 2 2 0 12 6
int len;
cin>>len;
int *iArr=new int[len];//分配动态数组
for (int i = 0; i < len; i++)
{
cin>>iArr[i];
}
cout << "排序前:";
for (int i = 0; i < len; i++) {
cout << iArr[i] << " ";
}
cout << "\n去重排序后:";
insertSort_0(iArr, len);
cout << iArr[0] << " ";
for (int j = 1; j < len; j++) {
if (iArr[j]!=iArr[j-1])
{
cout << iArr[j] << " ";
}
}
cout << endl;
system("pause");
delete[] iArr;释放数组,delete后面的[]不能少。
return 0;
}