插入排序之直接插入排序

來源:互聯網
上載者:User

直接插入排序

時間複雜度O(n^2)

附加空間O(1)

穩定排序

#define _CRT_SECURE_NO_WARNINGS#include <iostream>using namespace std;#define LEN 8//有LEN個元素要排struct Record {//為了考察排序的穩定性,定義元素是結構體類型int key;int otherinfo;};void InsertSort(Record *arr, int length)//length是要排序的元素的個數,0號單元除外{for (int i = 2; i <= length; i++) {if (arr[i - 1].key > arr[i].key) {//若判斷時改為>=,則是不穩定排序,下同arr[0] = arr[i];arr[i] = arr[i - 1];int j;for (j = i - 2; arr[j].key > arr[0].key; j--)arr[j + 1] = arr[j];arr[j + 1] = arr[0];}}}int main(void){freopen("in.txt", "r", stdin);Record a[LEN + 1] = {0};for (int i = 1; i <= LEN; i++)cin >> a[i].key >> a[i].otherinfo; InsertSort(a, LEN);for (int i = 1; i <= LEN; i++)cout << a[i].key << '\t' << a[i].otherinfo << endl;return 0;}/*in.txt:49 138 065 097 076 013 027 049 2out:13      027      038      049      149      265      076      097      0*/

若排序的函數寫成下面這樣:

void InsertSort(Record *arr, int length)//length是要排序的元素的個數,0號單元除外{for (int i = 2; i <= length; i++) {arr[0] = arr[i];//噹噹前比較的元素比前一個大時(前面的都已排好序),可直接continue,以免複製去又複製來int j;for (j = i - 1; arr[j].key > arr[0].key; j--)arr[j + 1] = arr[j];arr[j + 1] = arr[0];}}

代碼是簡潔了些,但有些微妙的缺陷,如注釋所示。

比如排

1227

用第二種要浪費兩次複製。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.