直接插入排序升序,降序,去重排序
阿新 • • 發佈:2019-02-10
排序思路:每次將一個待排序的元素與已排序的元素進行逐一比較,直到找到合適的位置按大小排序。
插入排序:時間複雜度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;
}